bzoj2190[SDOI2008]仪仗队(欧拉函数)
Description
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。
现在,C君希望你告诉他队伍整齐时能看到的学生人数。
Input
共一个数N。
Output
共一个数,即C君应看到的学生人数。
Sample Input
4
Sample Output
9
HINT
【数据规模和约定】 对于 100% 的数据,1 ≤ N ≤ 40000
观察发现,若x>0且y>0,当且仅当gcd(x,y)=1时能看到点(x,y),用欧拉函数搞一搞,可以发现x>0且y>0是能看到的数量是2*[f(1)+f(2)+...+f(n)]-1(设欧拉函数是f,因为(1,1)算了两次,所以要减1),最后再加上(0,1)和(1,0)两个点,所以ans=2*[f(1)+f(2)+...+f(n)]-1。
1 program rrr(input,output); 2 var 3 a:array[0..40040]of boolean; 4 f:array[0..40040]of longint; 5 i,j,n,ans:longint; 6 begin 7 assign(input,'r.in');assign(output,'r.out');reset(input);rewrite(output); 8 readln(n);dec(n); 9 for i:=1 to n do f[i]:=i; 10 fillchar(a,sizeof(a),true); 11 for i:=2 to n do 12 if a[i] then 13 begin 14 j:=i;while j<=n do begin f[j]:=f[j] div i*(i-1);j:=j+i; end; 15 j:=i<<1;while j<=n do begin a[j]:=false;j:=j+i; end; 16 end; 17 ans:=0; 18 for i:=1 to n do ans:=ans+f[i]; 19 write(ans<<1+1); 20 close(input);close(output); 21 end.