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.

 

posted @ 2017-03-02 18:44  Klaier  阅读(202)  评论(0编辑  收藏  举报