唯一分解定理是数论里面非常重要的一部分,必须要熟练掌握💪

一、定义

唯一分解定理又称算术基本定理,指:一个大于一的正整数N都可以唯一分解成有限个质数的乘积, N=p1a1 * p2a2 * p3a3 * … * pnan,这里p1< p2< p3 <…< pn均为质数,ai均为正整数.这样的式子成为N的标准分解式

二、证明

一个数肯定是由合数和质数构成的,合数又可以分解成质数和合数,最后递归下去就会变成质数的乘积
例如: 36==4 * 9||6 * 6==2 * 3 * 2 * 3==22 * 32
详细可以看具体严谨证明

三、应用

1.求出数n的因子个数

个数==(1+a1)* (1+a2) * (1+a3) * (1+a4)…*(1+an) 这里的ai表示N的标准分解式的幂次数
因为当我的a1=3时那我n的因子肯定会有 p10 p11 p12 p13 这四个数
然后再和p2的个数搭配起来就是两个数的因子数相乘了 p1x 可以与 p2y 随意搭配,所以进行乘法
就比如上面的36:

图上很容易看出来一个数的因子一定可以表示成其质因子的乘积形式,所以就有了第二个应用

2.求所有的因子之和

还是上面的图,所有因子和就是上面的9个数的和,而这9个数是由左面的两竖列两两相乘得到的,所以就有:
1+3+9+2+6+18+4+12+36==(1+2+4) * (1+3+9)==(20+21+23) * (30+31+32)
公式:(q10+q11+q12…q1a1)* (q20+q21+q22…q2a2) * …*(qn0+qnn+qn2…qnan

3.求gcd和lcm

给你两个数如何用唯一分解定理求其gcd和lcm,假设两个数是a和b则:
a==p1a1 * p2a2 * p3a3 * … * pnan
b==p1b1 * p2b2 * p3b3 * … * pnbn
两者
gcd==p1min(a1,b1) * p2min(a2,b2) * p3min(a3,b3) * … * pnmin(an,bn)
反之求lcm就是把上面得min全部换成max
例如:
4==2^2
6==2*3
gcd(4,6)==2min(2,1) * 3min(0,1)==2
lcm(4,6)==2max(2,1) * 3max(0,1)==12

补充

一个数的标准分解式不会太长,因为1,2,3,5,7,11,13,17,19,23就这几个数乘积就超过1e8了

代码

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5;
int isprime(int n){
	if(n==1) return 0;
	for(int i=2;i*i<=n;i++){
		if(n%i==0) return 0;
	}
	return 1;
}
int pr[50],cnt;
int main()
{
	int n;
	cin>>n;
	for(int i=2;i<=50;i++){ //筛选出50以内的所有指数
		if(isprime(i)){
			pr[++cnt]=i;
		}
	}
	for(int i=1;i<=cnt&&pr[i]*pr[i]<=n;i++){//注意这里有优化pr[i]*pr[i]<=n
		if(n%pr[i]==0){
			int e=0;
			while(n%pr[i]==0){
				e++;
				n/=pr[i];
			}
			cout<<pr[i]<<"^"<<e<<endl;
		}
	}
	if(n>1) cout<<n<<"^"<<1<<endl;//当n>1时n一定也是质数且其一定大于sqrt(n)所以其指数一定为1
	return 0;
}

一个好奇的人