P1829 [国家集训队] Crash的数字表格 / JZPTAB

有点难度的题目。

一眼看到 \(\gcd(i,j)\) 就用了 \(\phi\) , 结果死了。

用莫比乌斯函数套进去搞一搞先 :

\[\begin{aligned} & \sum\limits^n_{i=1} \sum\limits^m_{j=1} \text{lcm}(i,j) \\ = &\sum\limits^n_{i=1} \sum\limits^m_{j=1} \frac {ij}{\gcd(i,j)} \\ = & \sum\limits^{\min\{n,m\}}_{k=1} \sum\limits^n_{i=1} \sum\limits^m_{j=1} \frac{ij}{k} [\gcd(i,j)=k] \\ = & \sum\limits^{\min\{n,m\}}_{k=1} \sum\limits^{\left\lfloor \frac n k \right\rfloor}_{i=1} \sum\limits^{\left\lfloor \frac m k \right\rfloor}_{j=1} \frac{(ik)(jk)}{k} [\gcd(i,j)=1] \\ = & \sum\limits^{\min\{n,m\}}_{k=1} \sum\limits^{\left\lfloor \frac n k \right\rfloor}_{i=1} \sum\limits^{\left\lfloor \frac m k \right\rfloor}_{j=1} ijk \sum\limits_{d|\gcd(i,j)}\mu(d) \\ = & \sum\limits^{\min\{n,m\}}_{k=1} \sum\limits^{\min\{\left\lfloor \frac n k \right\rfloor,\left\lfloor \frac m k \right\rfloor\}}_{d=1} \mu(d) \sum\limits^{\left\lfloor \frac n k \right\rfloor}_{i=1} \sum\limits^{\left\lfloor \frac m k \right\rfloor}_{j=1} ijk [d|i] [d|j] \\ = & \sum\limits^{\min\{n,m\}}_{k=1} \sum\limits^{\min\{\left\lfloor \frac n k \right\rfloor,\left\lfloor \frac m k \right\rfloor\}}_{d=1} \mu(d) \sum\limits^{\left\lfloor \frac n {kd} \right\rfloor}_{i=1} \sum\limits^{\left\lfloor \frac m {kd} \right\rfloor}_{j=1} ijkd^2 \\ = & \sum\limits^{\min\{n,m\}}_{k=1} k \sum\limits^{\min\{\left\lfloor \frac n k \right\rfloor,\left\lfloor \frac m k \right\rfloor\}}_{d=1} d^2\mu(d) \left( \sum\limits^{\left\lfloor \frac n {kd} \right\rfloor}_{i=1} i \right) \left( \sum\limits^{\left\lfloor \frac m {kd} \right\rfloor}_{j=1} j \right) \\ = & \sum\limits^{\min\{n,m\}}_{T=1} \left( \sum\limits^{\left\lfloor \frac n T \right\rfloor}_{i=1} i \right) \left( \sum\limits^{\left\lfloor \frac m T \right\rfloor}_{j=1} j \right) \sum\limits_{d|T} d^2\mu(d) \frac{T}{d} \\ = & \sum\limits^{\min\{n,m\}}_{T=1} T \left( \sum\limits^{\left\lfloor \frac n T \right\rfloor}_{i=1} i \right) \left( \sum\limits^{\left\lfloor \frac m T \right\rfloor}_{j=1} j \right) \sum\limits_{d|T} d\mu(d) \end{aligned} \]

我们发现如果 \(T\sum\limits_{d|T} d\mu(d)\) 可以进行预处理的话那么这个式子就是 \(O(n^{\frac{1}{2}})\) 的。

我们设 \(\text F(T)=\sum\limits_{d|T} d\mu(d)\) , 是一个积性函数 : \(\mu\) 是积性函数 , \(\sum\limits_{d|T}=\sum\limits_{x|T,y|T,x \perp y} xy\) , 得证。

那么我们就可以知道 \(\text F(Tp)=\text F(T) \times \text F(p)\) ( \(p \in prime\) ) 。我们又可以知道 \(\text F(p)=1+(-p)=1-p\) , 注意到这个有质数贡献的导向 , 所以可以欧拉筛。

最后记得把 \(T\) 乘进去并且取前缀和。时间复杂度 \(O(n+n^{\frac{1}{2}})\)

Uses math;

Const
    total=10000000+10;
    modn=20101009;

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

function Square(n:longint):longint; begin exit(n*(n+1) >> 1 mod modn); end;

procedure Incea_make(total:longint);
var i,j,k,tail:longint;
begin
   incea[1]:=1; tail:=0;
   for i:=2 to total do
   begin
        if isprime[i]=False then begin inc(tail); prime[tail]:=i; incea[i]:=1-i; end;
        for j:=1 to tail do
        begin
            if prime[j]*i>total then break;
            isprime[prime[j]*i]:=True;
            if (i mod prime[j]=0) then begin incea[prime[j]*i]:=incea[i] mod modn; break; end
            else incea[prime[j]*i]:=incea[i]*incea[prime[j]] mod modn;
        end;
   end;
   for i:=1 to total do incea[i]:=(incea[i]*i mod modn+incea[i-1]) mod modn;
end;

begin
    read(n,m); Incea_make(max(m,n)+1);
    i:=1; j:=0;
    repeat
        j:=min(n div (n div i),m div (m div i));
        inc(ans,(Square(n div i)*Square(m div i) mod modn)*(incea[j]-incea[i-1]) mod modn);
        ans:=ans mod modn; i:=j+1;
    until i>min(n,m);
    writeln((ans+modn) mod modn);
end.

坑点 : 最后记得 \((ans+modn) \mod modn\) !! 不然爆负数

posted @ 2019-11-24 12:50  _ARFA  阅读(75)  评论(0编辑  收藏  举报