唯一分解定理
一个数n肯定能被分解成 n=p1a1* p2a2*…*pnan
1、质数:对于质数而言,其因子只有1和其本身。
2、合数:一个合数可以分解为一个合数和一个质数,质数不可再分解,而合数还可以再分解下去。因此一个数就会变成多个(质数的n次方)的乘积
例如36可分解为22*32
所以唯一质数分解定理有两个应用
1、求一个数因子的个数
假设一个数因子个数为p
p=(1+a1)(1+a2)…(1+an)
2、求所有因子之和
公式(乘积):(q10+q11+q12…q1a1)(q20+q21+q22…q2a2)…x(qn0+qn1+qn2…qnan)
原题代码:
#include <bits/stdc++.h>
using namespace std;
long long prime[1000010],p[1000010],cnt;
void eulor(int n)
{
for(int i=2;i<=n;i++)
{
if(!p[i])
{prime[++cnt]=i;}
for(int j=1;j<=cnt;j++)
{
if(i*prime[j]>n)
{break;}
p[i*prime[j]]=1;
if(i%prime[j]==0)
{break;}
}
}
}
int main()
{
long long op=0;
long long t,n;
eulor(1000000);
scanf("%lld",&t);
while(t--)
{
op++;
scanf("%lld",&n);
long long l=sqrt(n);
long long ans=1,kk=0;
for(int i=1;prime[i]<=l;i++)
{
kk=0;
while(n%prime[i]==0)
{
n/=prime[i];
kk++;
}
ans*=(kk+1);
if(n==1)
{break;}
}
if(n!=1)
{ans=(ans*2)-1;}
if(n==1)
{ans--;}
printf("Case %lld: %lld\n",op,ans);
}
return 0;
}
->个人博客