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.
posted @ 2019-11-24 12:54  _ARFA  阅读(66)  评论(0编辑  收藏  举报