P3455 [POI2007] ZAP-Queries
大概是这样子的 :
\[\begin{aligned} & \sum\limits^{n}_{i=1}\sum\limits^{m}_{j=1} [\gcd(i,j)=k] \\= & \sum\limits^{\lfloor\frac{n}{k}\rfloor}_{i=1}\sum\limits^{\lfloor\frac{m}{k}\rfloor}_{j=1} [\gcd(i,j)=1] \\ = & \sum\limits^{\lfloor\frac{n}{k}\rfloor}_{i=1}\sum\limits^{\lfloor\frac{m}{k}\rfloor}_{j=1} \sum\limits_{d|\gcd(i,j)} \mu(d) \\= & \sum\limits^{\min\{\lfloor\frac{n}{k}\rfloor,\lfloor\frac{m}{k}\rfloor\}}_{d=1} \mu(d) \sum\limits^{\lfloor\frac{n}{k}\rfloor}_{i=1}\sum\limits^{\lfloor\frac{m}{k}\rfloor}_{j=1} [d|\gcd(i,j)] \\= & \sum\limits^{\min\{\lfloor\frac{n}{k}\rfloor,\lfloor\frac{m}{k}\rfloor\}}_{d=1} \mu(d) \times \lfloor\frac{n}{dk}\rfloor \lfloor\frac{m}{dk}\rfloor \\\end{aligned}
\]
- 第一步转化 : 规律。假设 \(k\) 就是 \(\gcd(i,j)\) ,那么 \(\gcd(\frac{n}{k},\frac{m}{k})=1\)。
- 第三步转化 : 直接用 \(d\) 来枚举每一个 \(\gcd(i,j)\) 即可。
- 第四步转化 : 等差公式 , 后面那一坨直接数论分块即可。
然后注意一下后面那个东西不能拆 , 所以前缀和要套进去搞。
还有就是这里的 \(\mu\) 不需要 \(O(n)\) 处理 , 直接按照定理 \(\sum\limits_{d|n} -\mu(d)[d \not= n]=\mu(n)\) (\(n \not= 1\)) 就可以了 , 复杂度是 \(O(n \log n)\) 的。总复杂度 \(O(n^{\frac{3}{2}}+n \log n)\) 喽。
Uses math;
Const
total=50000+10;
var
incea,mobius:array[-1..total] of shortint;
i,j,test,n,m,k:longint;
function MaBlTe(num:longint):longint;
var i,j:longint;
begin
i:=1; j:=0; n:=n div k; m:=m div k; MaBlTe:=0;
while i<=num do
begin
j:=min(n div (n div i),m div (m div i));
inc(MaBlTe,(n div i)*(m div i)*(incea[j]-incea[i-1])); i:=j+1;
end;
end;
begin
read(test); mobius[1]:=1;
for i:=1 to total do for j:=2 to total div i+1 do begin if i*j>total then break; dec(mobius[i*j],mobius[i]); end;
for i:=1 to total do incea[i]:=incea[i-1]+mobius[i];
for i:=1 to test do begin read(n,m,k); writeln(MaBlTe(min(n div k,m div k))); end;
end.
完结撒花!✿✿ヽ(゚▽゚)ノ✿