欧拉函数
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);//先进行除法是为了防止中间数据的溢出 }