bzoj 2190 欧拉函数线性筛

来源:互联网 发布:python怎么用for循环 编辑:程序博客网 时间:2024/06/06 04:09

根据图显然如果我们沿着对角线把它切开,新形成的这两部分是对称,每一部分的答案为sigma(phi(i)) (1<=i<=n-1)

那么整体的答案ans=2*sigma(phi(i))+1  (对角线上只能看到一个点(1,1)) (1<=i<=n-1)

线性筛1~n-1的欧拉函数即可

var        n               :longint;        ans             :int64;        phi,prime       :array[0..40010] of longint;        vis             :array[0..40010] of boolean;        i               :longint;procedure pre_do;var        i,j,tt:longint;begin   phi[1]:=1;  tt:=0;   for i:=2 to n do   begin      if not vis[i] then      begin         inc(tt);         phi[i]:=i-1;         prime[tt]:=i;      end;      //      for j:=1 to tt do        if (prime[j]*i>n) then break else        begin           vis[i*prime[j]]:=true;           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]*phi[prime[j]];        end;   end;   //end;begin   read(n);   pre_do;   ans:=0;   for i:=1 to n-1 do inc(ans,int64(phi[i]));   ans:=(ans<<1)+1;   writeln(ans);end.
——by Eirlys



0 0
原创粉丝点击