题意:给定N,求所有小于等于N的a/b,gcd(a,b)=1(a<b).
思路:就是求小于等于N的欧拉函数。
题目链接:http://poj.org/problem?id=2478
View Code
1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 #include <algorithm> 7 #include <iostream> 8 using namespace std; 9 const int N=1000010; 10 11 int phi[N],n; 12 13 int main(){ 14 15 // freopen("data.in","r",stdin); 16 // freopen("data.out","w",stdout); 17 18 for(int i=1;i<N;i++) phi[i]=i; 19 for(int i=2;i<N;i+=2) phi[i]/=2; 20 for(int i=3;i<N;i++) 21 if(phi[i]==i){ 22 for(int j=i;j<N;j+=i) 23 phi[j]=phi[j]/i*(i-1); 24 } 25 while(scanf("%d",&n),n){ 26 long long sum=0; 27 for(int i=2;i<=n;i++) sum+=phi[i]; 28 printf("%lld\n",sum); 29 } 30 return 0; 31 }