算术基本定理(唯一分解定理)
认识:
任何大于1的自然数,都可以唯一分解成有限个质数的乘积
这里P均为质数,其指数a是正整数。
这样的分解称为的标准分解式。
唯一分解定理的基本应用:
① 一个大于1的正整数N,将其化成标准分解式N = p1^a1 * p2^a2 *....pn^an(例如24 = 2^3 * 3^1),那么N的正因数个数为σ1(N) = (a1+1)*(a2+1)*....(an+1)( 因子各不相同)
(p1..pn为N的素因子,a1...an为各素数的幂)
② 所有正因数之和为σ2 = (1+p1+p1^2+...p1^a1)* (1+p2+p2^2+....p2^a2) * ..... *(1+pn+pn^2+.....pn^an);当σ2(N) = 2*N时称N为完全数,是否存在奇完全数,尚不明确
③ 利用算数基本定理可以重新定义a和b的最大公因子(a,b)和最小公倍数(a,b), a*b= 最大公因子(a,b)* 最小公倍数(a,b)
唯一分解定理模板
void find_prime()//素数打表
{
k=0;
for(ll i=2;i<maxn;i++)
{
if(!p[i])
{
prim[k++]=i;//储存质素
for(ll j=i*2;j<maxn;j+=i)
{
p[j]=1;
}
}
}
}
ll slove(ll a)
{
ll s=1;
for(int i=0;i<k&&a;i++)
{
ll x=0;
if(prim[i]>a)
break;
//核心代码 按顺序对素数取余,得到该素数的指数
while(a%prim[i]==0)//注意是while啊!
{
a/=prim[i];
x++;
}
s*=(x+1);//得到一个素数的指数后用公式
}
if(a>1)
{
s*=(1+1);//如果a不能被整分,说明a还有一个素数是它的约数,此时x=1,所以是1+1,
}
return s;
}
1.Pairs Forming LCM
题目:https://vjudge.net/problem/LightOJ-1236