Poj 2478 Farey Sequence
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
|
题解:其实就是求出2-N的欧拉函数之和,弄个前缀和即可= =(PS:最近才学的欧拉函数,拿来用用^_^)
1 var 2 i,j,l,m,n:longint; 3 a,b:array[0..1000005] of int64; 4 begin 5 for i:=2 to 1000000 do 6 begin 7 if a[i]=0 then 8 begin 9 inc(b[0]); 10 b[b[0]]:=i; 11 a[i]:=i-1; 12 end; 13 for j:=1 to b[0] do 14 begin 15 if (b[j])>(1000000 div i) then break; 16 if (i mod b[j])=0 then a[i*b[j]]:=a[i]*b[j] else a[i*b[j]]:=a[i]*(b[j]-1); 17 end; 18 end; 19 a[1]:=0; 20 for i:=2 to 1000000 do a[i]:=a[i-1]+a[i]; 21 while not(eof) do 22 begin 23 readln(n); 24 if n=0 then halt; 25 writeln(a[n]); 26 end; 27 end.