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.
完结撒花!✿✿ヽ(゚▽゚)ノ✿