裸欧拉函数。
#include<stdio.h> #include<string.h> const int N=1e5+11; int p[N],pr[N],cnt; void init(){ for(int i=2;i<N;i++){ if(!p[i])pr[++cnt]=i; for(int j=1;j<=cnt&&i*pr[j]<N;j++){ p[i*pr[j]]=1; if(i%pr[j]==0) break; } } } int er(int n){ int ans=n; for(int i=1;i<=cnt&&pr[i]*pr[i]<=n;i++){ if(n%pr[i]==0){ ans=ans/pr[i]*(pr[i]-1);//先除后乘,防止溢出 while(n%pr[i]==0) n/=pr[i]; } } if(n>1) ans=ans/n*(n-1); return ans; } int main(){ int n;init(); while(~scanf("%d",&n)&&n){ if(n==1){ printf("0 "); continue ; } printf("%d ",er(n)); } return 0; }