Farey Sequence
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 14291 | Accepted: 5647 |
Description
The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 < a < b <= n and gcd(a,b) = 1 arranged in increasing order. The first few are
F2 = {1/2}
F3 = {1/3, 1/2, 2/3}
F4 = {1/4, 1/3, 1/2, 2/3, 3/4}
F5 = {1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5}
You task is to calculate the number of terms in the Farey sequence Fn.
F2 = {1/2}
F3 = {1/3, 1/2, 2/3}
F4 = {1/4, 1/3, 1/2, 2/3, 3/4}
F5 = {1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5}
You task is to calculate the number of terms in the Farey sequence Fn.
Input
There are several test cases. Each test case has only one line, which contains a positive integer n (2 <= n <= 106). There are no blank lines between cases. A line with a single 0 terminates the input.
Output
For each test case, you should output one line, which contains N(n) ---- the number of terms in the Farey sequence Fn.
Sample Input
2 3 4 5 0
Sample Output
1 3 5 9
Source
POJ Contest,Author:Mathematica@ZSU
题解:
直接欧拉函数,求个前缀和,就好了。
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<iostream> 6 #include<algorithm> 7 using namespace std; 8 #define LL long long 9 LL qz[1000010]; 10 int phi[1000010],prime[80010],tot; 11 bool vis[1000010]; 12 void Eular() 13 { 14 int i,j; 15 phi[1]=1;tot=0; 16 for(i=2;i<=1000000;i++) 17 { 18 if(vis[i]==false) 19 { 20 prime[++tot]=i; 21 phi[i]=i-1; 22 } 23 for(j=1;j<=tot&&prime[j]*i<=1000000;j++) 24 { 25 vis[prime[j]*i]=true; 26 if(i%prime[j]==0) 27 { 28 phi[prime[j]*i]=phi[i]*prime[j]; 29 break; 30 } 31 phi[prime[j]*i]=phi[prime[j]]*phi[i]; 32 } 33 } 34 } 35 void Qz() 36 { 37 for(int i=1;i<=1000000;i++)qz[i]=qz[i-1]+phi[i]; 38 } 39 int main() 40 { 41 int n; 42 Eular(); 43 //for(int i=1;i<=100;i++)printf("%d ",phi[i]); 44 //printf(" "); 45 Qz(); 46 while(1) 47 { 48 scanf("%d",&n); 49 if(n==0)break; 50 printf("%lld ",qz[n]-1); 51 } 52 return 0; 53 }