欧拉函数
1.欧拉筛法求素数
int ss(int n)//求小于n的素数个数
{
int cnt=0;
for(int i=2;i<n;i++){
if(!vis[i]){
prime[++cnt]=i;//如果这个数之前没有被删除,那么这个数是素数
}
for(int j=1;j<=cnt;j++){
if(i*prime[j]>=n) break;
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
//这种情况下,这个数以后的一定会被之后的数删除
}
}
return cnt;
}
2.欧拉函数求1~n中和n互质的个数
(1)直接求解
int sol(int n){ //直接求解欧拉函数
int res=n;
int a=n;
for(int i=2;i*i<=a;i++){
if(a%i==0){
res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出
while(a%i==0) a/=i;
}
}
if(a>1) res=res/a*(a-1);
return res;
}
(2)打表
void sol(int n){ //打表求欧拉函数
ans[1]=1;
for(int i=2;i<=n;i++)
ans[i]=i;
for(int i=2;i<=n;i++)
if(ans[i]==i)//如果这个数
for(int j=i;j<=n;j+=i)
ans[j]=ans[j]/i*(i-1);//先进行除法是为了防止中间数据的溢出
}
浙公网安备 33010602011771号