定义:任何一个大于1的自然数
![](https://gss3.bdstatic.com/-Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D14/sign=7896797ddfc451daf2f608efb6fd720b/b3fb43166d224f4a43e792300bf790529822d193.jpg)
![](https://gss3.bdstatic.com/7Po3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D124/sign=ae84eec8b4fd5266a32b38169f189799/f703738da97739129c546742fa198618367ae2a7.jpg)
![](https://gss2.bdstatic.com/-fo3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D115/sign=69e7dd71272dd42a5b0905aa363a5b2f/8c1001e93901213f06c3c6c456e736d12f2e9532.jpg)
![](https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D12/sign=813229e9ad51f3dec7b2bd6694ee3964/83025aafa40f4bfbe7c97f77014f78f0f73618f3.jpg)
我们知道了唯一分解定理后有什么用呢
应用一:N的因子个数就为
应用二:N的因子和为
对N进行分解时我们要先打个素数表打到√N就够了,然后用试除法来枚举N的因子,时间复杂度为O(√N)
const int maxn=1000005;
bool vis[11000001];
int vis1[1000001];
long long prim[maxn],an[maxn];
int p;
void getprim()//素数打表
{
memset(vis,true,sizeof(vis));
long long t=0;
for(int i=2; i<=11000001; i++)
{
if(vis[i])
prim[t++]=i;
for(int j=0; j<t&&prim[j]*i<=11000001; j++)
{
vis[i*prim[j]]=false;
if(i%prim[j]==0)
break;
}
}
}
void phi(long long n)
{
long long sum=1,ans,m;
m=n;
p=0;
for(int i=0; prim[i]*prim[i]<=n; i++)//试除法找因子
{
if(n%prim[i]==0)
{
ans=0;
while(n%prim[i]==0)
{
ans++;
n/=prim[i];
}
an[p++]=ans;//an数组存的是指数
}
}
if(n>1)//若因子都找完了要么是1,要么他本身是质数
{
ans=0;
while(m%n==0)
{
ans++;
m/=n;
}
an[p++]=ans;
}
}