名字是法雷数列其实是欧拉phi函数
Farey Sequence
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. 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 <iostream> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 typedef unsigned long long int LL; 8 9 LL sum[1001000],phi[1001000]; 10 11 void phi_table() 12 { 13 phi[1]=1; 14 for(int i=2;i<=1000010;i++)if(!phi[i]) 15 { 16 for(int j=i;j<=1000010;j+=i) 17 { 18 if(!phi[j]) phi[j]=j; 19 phi[j]=phi[j]/i*(i-1); 20 } 21 } 22 sum[2]=1; 23 for(int i=3;i<=1000010;i++) 24 { 25 sum[i]=sum[i-1]+phi[i]; 26 } 27 } 28 29 int main() 30 { 31 phi_table(); 32 int n; 33 while(scanf("%d",&n)!=EOF&&n) 34 { 35 printf("%llu ",sum[n]); 36 } 37 return 0; 38 }