数学知识:约数的详细解析

🎬 博主名称个人主页

🔥 个人专栏 : 《算法通关》《Java讲解》

⛺️心简单,世界就简单

序言

讲一下约数,平时做题时候还是经常会出现的,比如求两个数的最大公约数,求一个数的因数个数
目录

🎠序言

🎠试除法求约数

🎠约数个数

🎃内容讲解

🎃公式总结

🎠约数之和

🎠欧几里得算法


试除法求约数

因为约数也是成对出现的,比如2 * 6 = 12,我们就只用求出来2后然后直接把12 / 2也push_back()里面就行,所以我们的循环条件是到n / i

cpp 复制代码
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;

const int N = 1e6 +10; 

vector<int> get_divisors(int n){
	vector<int> res;
	for(int i = 1; i <= n / i; i++){
		if(n % i == 0){
			res.push_back(i);
			if(i != n / i) res.push_back(n / i);
		}
	}
	sort(res.begin(), res.end());
	return res;
}


int main(){
	int n;
	cin >> n;
	
	while(n --){
		int x;
		cin >> x;
		auto res = get_divisors(x);
		for(auto t : res) cout << t << ' ';
		cout <<endl;
	}
}

约数个数

内容讲解

如果我直接拿公式可能看不大懂,所以我就先举个例子

eg.求12的约数个数

第一步: 分解成质数相乘的样子:12 = 2 × 2 × 3 = 2² × 3¹

**第二步:**理解约数是怎么来的L:

  • 对于质数2:有3种选择

    • 选0个2(就是1)

    • 选1个2(就是2)

    • 选2个2(就是4)

  • 对于质数3:有2种选择

    • 选0个3(就是1)

    • 选1个3(就是3)

**第三步:**比喻一下

  • 上衣有3种选择(2⁰, 2¹, 2²)

  • 裤子有2种选择(3⁰, 3¹)

总搭配数 = 3 × 2 = 6 种

总结

这6种搭配就是12的所有约数:

1 = 2⁰ × 3⁰

2 = 2¹ × 3⁰

3 = 2⁰ × 3¹

4 = 2² × 3⁰

6 = 2¹ × 3¹

12 = 2² × 3¹


公式总结

如果一个数分解成:质数1^a × 质数2^b × 质数3^c × ...

那么约数个数 = (a+1) × (b+1) × (c+1) × ...

我们拿个题来看一下

这道题让我求一堆数相乘后的约数,笨方法当然是先相乘之后再求质数个数,但我们实际上可以直接用一个哈希表记录一下每个数的质数然后++就行

cpp 复制代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>

using namespace std;

typedef long long LL;

const int mod = 1e9 +7; 


int main(){
	int n;
	cin >> n;
	
	unordered_map<int, int> primes;
	while(n --){
		int x;
		cin >> x;
	for(int i = 2; i <= x / i; i ++){
		while(x % i == 0) {
			x /= i;
			primes[i] ++ ;
		}
	
	}
		if(x > 1) primes[x] ++ ;
	}
	
	LL res = 1;
	for(auto prime : primes) res = res * (prime.second + 1) % mod;
	
	cout << res;
	
}

约数之和

这个求和其实我感觉很妙

就是我们上面不是得到了约数之和吗,然后我们还拿这个12来看

12 = 2 × 2 × 3 = 2² × 3¹

约数为 1 2 3 4 6 12 ,那么和就是28了

我们还可以发现(1 + 2 + 4) * (1 + 3)= 28

然后我们的结论就是求出质因数的和然后相乘,就是下面这一步

cpp 复制代码
	int p = prime.first, a = prime.second;
		LL t = 1;
		while(a --){
			t = (t * p + 1) % mod;
		
		}
cpp 复制代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>

using namespace std;

typedef long long LL;

const int mod = 1e9 +7; 


int main(){
	int n;
	cin >> n;
	
	unordered_map<int, int> primes;
	while(n --){
		int x;
		cin >> x;
	for(int i = 2; i <= x / i; i ++){
		while(x % i == 0) {
			x /= i;
			primes[i] ++ ;
		}
	
	}
		if(x > 1) primes[x] ++ ;
	}
	
	LL res = 1;
	for(auto prime : primes){
		int p = prime.first, a = prime.second;
		LL t = 1;
		while(a --){
			t = (t * p + 1) % mod;
		
		}
			res = res * t % mod;
	}
	
	cout << res;
	
}

欧几里得算法

就是求最大公约数,这个大家都会就不详细说明了,就是辗转相除法,当b=0时候,就直接返回a的值就行

cpp 复制代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>

using namespace std;

typedef long long LL;

const int mod = 1e9 +7; 

int gcd(int a, int b){
	return b ? gcd(b, a % b) : a;
} 

int main(){
	int n;
	 scanf("%d", &n);
	 while(n --){
	 	int a, b;
	 	scanf("%d%d", &a, &b);
	 	printf("%d\n", gcd(a, b));
	 }
}
相关推荐
youngerwang34 分钟前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
KaMeidebaby1 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
手写码匠2 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
无限码力2 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试
lqqjuly2 小时前
MLA — 多头潜在注意力深度解析
深度学习·神经网络·算法
吴可可1233 小时前
SolidWorks草图转三维DWG技巧
算法
redaijufeng3 小时前
C++雾中风景7:闭包
c++·算法·风景
小欣加油4 小时前
leetcode287寻找重复数
数据结构·c++·算法·leetcode
尽兴-4 小时前
2.1 向量基础:Embedding、余弦相似度、欧氏距离、向量检索
算法·embedding·欧氏距离·向量检索·余弦相似度
Black蜡笔小新4 小时前
自动化AI算法训练服务器DLTM训推一体工作站赋能多行业智能化升级
人工智能·算法·自动化