如果欧拉函数单独算的话,那么先把素数存下来,再算欧拉函数会快一点,因为一个一个合数一定都质数组成,所以用素数来算欧拉函数会快一点,因为循环少一点。
下面是欧拉函数打表且与筛素数同时做:
const int maxn=50000+100;
int is_prime[maxn],primes[maxn],phi[maxn];
void euler_and_prime()
{
int cnt=0;
memset(is_prime,1,sizeof(is_prime));
for(int i=2;i<=maxn-100;i++)
{
if(is_prime[i]){
primes[cnt++]=i;
phi[i]=i-1;
}
for(int j=0;j<cnt&&i*primes[j]<=maxn-100;j++)
{
is_prime[i*primes[j]]=0;
if(i%primes[j]==0){
phi[i*primes[j]]=phi[i]*primes[j];
break;
}
else
phi[i*primes[j]]=phi[i]*(primes[j]-1);
}
}
}