P1447 [NOI2010] 能量采集

\(\phi\) 来弄比较容易 , 自己推了一下。纪念手推第 \(2\) 题。

\[\begin{aligned} & \sum\limits^{n}_{i=1}\sum\limits^{m}_{j=1} \gcd(i,j) \\ = & \sum\limits^{n}_{i=1}\sum\limits^{m}_{j=1}\sum\limits_{d|\gcd(i,j)} \phi(d) \\ = & \sum\limits^{\min\{n,m\}}_{d=1} \phi(d) \sum\limits^{n}_{i=1}\sum\limits^{m}_{j=1} [d|\gcd(i,j)] \\ = & \sum\limits^{\min\{n,m\}}_{d=1} \phi(d) \left \lfloor \frac n d \right \rfloor \left \lfloor \frac m d \right \rfloor \end{aligned}\]

预处理复杂度 \(O(n \log n)\) (鬼知道我为什么不写线性) , 查询复杂度 \(O(n^{\frac{1}{2}})\)

Uses math;

Const
    total=100000+10;

var
    incea,euler:array[-1..total] of int64;
    i,j,n,m,k,ans:longint;

function MaBlTe(num:longint):int64;
var i,j,l,r:longint;
begin
    i:=1; j:=0; l:=n; r:=m; MaBlTe:=0;
    while i<=num do
    begin
        j:=min(l div (l div i),r div (r div i));
        inc(MaBlTe,(l div i)*(r div i)*(incea[j]-incea[i-1])); i:=j+1;
    end;
end;

begin
    read(n,m);
    for i:=1 to total do euler[i]:=i;
    for i:=2 to total do if euler[i]=i then begin j:=i; repeat euler[j]:=trunc(euler[j]/i*(i-1)); inc(j,i); until j>total; end;
    for i:=1 to total do incea[i]:=incea[i-1]+euler[i];
    writeln(MaBlTe(min(n,m)) << 1-n*m);
end.
posted @ 2019-11-24 12:52  _ARFA  阅读(74)  评论(0编辑  收藏  举报