对于线性筛素数的增添,可以同时求出每个数的欧拉函数
首先需要三个性质
证明链接(转)
性质一:若p为质数,phi[p]=p-1(显然)
性质二:若 i mod p=0(p为质数),那么有phi[i*p]=p*phi[i]
性质三:若 i mod p≠0(p为质数),那么phi[i*p]=phi[i]*(p-1)
#include <cstdio>
#include <iostream>
using namespace std;
const int N=40000;
int phi[N+10],prime[N+10];
int tot,ans;
int mark[N+10];
void getphi()
{
phi[1]=1;
for(int i=2;i<=N;i++)
{
if(!mark[i])
{
prime[++tot]=i;
phi[i]=i-1;//性质1
}
for(int j=1;j<=tot&&i*prime[j]<=N;j++)
{
mark[i*prime[j]]=1;
if(!(i%prime[j]))
{
phi[i*prime[j]]=phi[i]*prime[j];//性质2
break;
}
else
phi[i*prime[j]]=phi[i]*(prime[j]-1);//性质3
}
}
}
int main()
{
getphi();
printf("%d",phi[8]);//1,3,5,7与8互质
return 0;
}