欧拉函数 [POJ 2478Farey Sequence]
//phi[i]记录的是 0~i 之间与i互质的数的个数
http://poj.org/problem?id=2478
View Code
const int MM = 1000005; typedef __int64 int64; int64 N; int64 phi[MM]; void get_phi() { int64 i,j,k; for(i=1;i<MM;i++) phi[i]=i; for(i=2;i<MM;i+=2) phi[i]>>=1; for(i=3;i<MM;i++) { if(phi[i]==i) { for(j=i;j<MM;j+=i) phi[j]=phi[j]/i*(i-1); } } } void solve() { int64 i,j,k,ans=0; for(i=2;i<=N;i++) { ans+=phi[i]; } printf("%I64d\n",ans); } int main() { get_phi(); while(scanf("%I64d",&N),N) solve(); return 0; }
//int euler(int x); 返回的是0~x间和x互质数的个数。
View Code
//int euler(int x); 返回的是0~x间和x互质数的个数。 int euler(int x) {// 就是公式 int i, res=x; for(i=2; (i*i)<=x ;i++) if(x%i==0) { res=res/i*(i-1); while(x%i==0) x/=i; // 保证i一定是素数 } if(x>1) res=res/x*(x-1); return res; }
//A^x = A^(x % Phi(C) + Phi(C)) (mod C)