bzoj 2818 欧拉函数

设w[i]为1-i中gcd(i,j)=1的数对数,那么w[i]:=2*Σphi[i]+1,欧拉函数线性生成就行了

然后ans=Σw[n/prime[i]]是比较显然的事。。

/**************************************************************
    Problem: 2818
    User: BLADEVIL
    Language: Pascal
    Result: Accepted
    Time:2672 ms
    Memory:156476 kb
****************************************************************/
 
//By BLADEVIL
var
    n                               :longint;
    mindiv, prime                   :array[0..10000100] of longint;
    phi                             :array[0..10000100] of int64;
    i, j                            :longint;
    ans                             :int64;
     
begin
    read(n);
    for i:=2 to n do
    begin
        if mindiv[i]=0 then
        begin
            inc(prime[0]);
            prime[prime[0]]:=i;
            mindiv[i]:=i;
            phi[i]:=i-1;
        end;
        for j:=1 to prime[0] do
        begin
            if i*prime[j]>n then break;
            mindiv[i*prime[j]]:=prime[j];
            if i mod prime[j]=0 then
            begin
                phi[i*prime[j]]:=phi[i]*prime[j];
                break;
            end else
                phi[i*prime[j]]:=phi[i]*(prime[j]-1);
        end;
    end;
    for i:=2 to n do phi[i]:=phi[i]+phi[i-1];
    for i:=1 to n do phi[i]:=2*phi[i]+1;
    for i:=1 to prime[0] do
        ans:=ans+phi[n div prime[i]];
    writeln(ans);
end.

 

posted on 2013-12-23 07:16  BLADEVIL  阅读(415)  评论(0编辑  收藏  举报