题解[P8570 牵连的世界]

· · 题解

原题链接

题意: 给定 n,m\leq 5\times 10^5,求 \displaystyle \left(\sum_{i=1}^n\sum_{j=1}^md(ij)\varphi(ij)\right)\bmod 10^9+7

不妨设 n\leq m

\sum_{i=1}^n\sum_{j=1}^md(ij)\varphi(ij) =\sum_{d=1}^n\sum_{i=1}^n\sum_{j=1}^md(ij)\dfrac{\varphi(i)\varphi(j)}{\varphi(d)}d[\gcd(i,j)=d] =\sum_{d=1}^n\dfrac{d}{\varphi(d)}\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}d(ijd^2)\varphi(id)\varphi(jd)\sum_{k|i,k|j}\mu(k) =\sum_{T=1}^n\left(\sum_{d|T}\dfrac{d}{\varphi(d)}\mu(T/d)\right)\sum_{i=1}^{n/T}\sum_{j=1}^{m/T}d(ijT^2)\varphi(iT)\varphi(jT)

\displaystyle f(T)=\sum_{d|T}\dfrac{d}{\varphi(d)}\mu(T/d),然后把后面的因数个数拆开。

=\sum_{T=1}^nf(T)\sum_{T|i,1\leq i\leq n}\sum_{T|j,1\leq j\leq m}\varphi(i)\varphi(j)d(ij) =\sum_{T=1}^nf(T)\sum_{T|i,1\leq i\leq n}\sum_{T|j,1\leq j\leq m}\varphi(i)\varphi(j)\sum_{a|i}\sum_{b|j}[\gcd(a,b)=1] =\sum_{T=1}^nf(T)\sum_{T|i,1\leq i\leq n}\sum_{T|j,1\leq j\leq m}\varphi(i)\varphi(j)\sum_{a|i}\sum_{b|j}\sum_{t|a,t|b}\mu(t) =\sum_{T=1}^nf(T)\sum_{T|i,1\leq i\leq n}\sum_{T|j,1\leq j\leq m}\varphi(i)\varphi(j)\sum_{t|i,t|j}\mu(t)d(i/t)d(j/t)

由于 t|i,T|i 等价于 \operatorname{lcm}(t,T)|i,枚举 x=\operatorname{lcm}(t,T)

\sum_{t=1}^n\mu(t)\sum_{t|x,1\leq x\leq n}\left(\sum_{x|i,1\leq i\leq n}\varphi(i)d(i/t)\right)\left(\sum_{x|j,1\leq j\leq m}\varphi(j)d(j/t)\right)\sum_{T=1}^nf(T)[\operatorname{lcm}(t,T)=x]

直接枚举 tt|x,再枚举 x|i 的复杂度是:

\sum\limits_{t=1}^n\sum\limits_{i=1}^{n/x}n/(xi)=\sum\limits_{t=1}^nn/x\ln(n/x)=O(n\ln^2 n)

所以只需对 t,x 快速求出 \displaystyle \sum_{T=1}^nf(T)[\operatorname{lcm}(t,T)=x]

但其实我们只需对 \mu(t) 非零的 t 求值。

再观察一下 f(T)=\sum\limits_{d|T}\dfrac{d}{\varphi(d)}\mu(T/d),这显然是积性的。

f(p^k)=\begin{cases}-1+\dfrac{p}{p-1}=\dfrac{1}{p-1},&k=1\\ \dfrac{p^k}{\varphi(p^k)}-\dfrac{p^{k-1}}{\varphi(p^{k-1})}=0,&k\geq 2\end{cases},也即 f(T) 仅在 \mu(T) 非零时有值。

既然 \mu(t)\neq 0,\mu(T)\neq 0,x=\operatorname{lcm}(t,T),则 \mu(x)\neq0

所以我们只需要没有平方因子的 t,T,x,求出 \displaystyle \sum_{T=1}^nf(T)[\operatorname{lcm}(t,T)=x]

x,t,T 的质因子集合分别为 P_x,P_t,P_T,则 P_t\cup P_T=P_x 且条件充要。

所以 P_T 必由 P_x\setminus P_t 的全部元素与 P_t 的一部分拼成。

因此 \displaystyle \sum_{T=1}^nf(T)[\operatorname{lcm}(t,T)=x]=\left(\prod_{p\in P_x,p\not\in P_t}f(p)\right)\left(\prod_{p\in P_t}\left(f(p)+1\right)\right)

最后面的 +1 就相当于 P_t 中的元素可选可不选。

另设积性函数 g(p)=f(p)+1=\dfrac{p}{p-1},g(n)=\prod\limits_{p|n}\dfrac{p}{p-1}

\displaystyle \sum_{T=1}^nf(T)[\operatorname{lcm}(t,T)=x]=f(x/t)g(t)

线性预处理出 f,g,d,\varphi,\mu,便可 O(n\ln^2 n) 做完了,空间线性。

核心代码:

for(t=1;t<=n;++t)if(mu[t]){
  res=0;
  for(x=t;x<=n;x+=t)if(mu[x]){
    sn=sm=0;
    for(i=x;i<=n;i+=x)add(sn,phi[i]*d[i/t]);
    for(i=x;i<=m;i+=x)add(sm,phi[i]*d[i/t]);
    add(res,1ll*sn*sm%mod*f[x/t]%mod*g[t]%mod);
  }
  add(ans,1ll*res*(mu[t]+mod)%mod);
}

评测记录 为什么时限不开 100ms

但再仔细观察一下,把每次处理的 t 的倍数拉出来,

我们发现在对于 t|xx 做的事无非是一个整除的后缀和。

因为在 t|x,t|i 时,x|i\Leftrightarrow \frac{x}{t}|\frac{i}{t}

所以这部分能被一个 \text{Dirichlet} 后缀和优化掉。

总时间复杂度降至 O(n\ln n\ln\ln n),虽然在数据范围只有 5\times 10^5 时没太大区别。

核心代码:

for(t=1;t<=n;++t)if(mu[t]){
  res=0;
  for(i=t;i<=n;i+=t)sn[i/t]=phi[i]*d[i/t];
  for(j=t;j<=m;j+=t)sm[j/t]=phi[j]*d[j/t];
  for(nn=n/t,k=1;k<=prm&&p[k]<=nn;++k)
    for(l=nn/p[k];l;--l)add(sn[l],sn[l*p[k]]);
  for(nn=m/t,k=1;k<=prm&&p[k]<=nn;++k)
    for(l=nn/p[k];l;--l)add(sm[l],sm[l*p[k]]);
  for(x=t;x<=n;x+=t)if(mu[x])
    add(res,1ll*sn[x/t]*sm[x/t]%mod*f[x/t]%mod*g[t]%mod);
  add(ans,1ll*res*(mu[t]+mod)%mod);
}

为什么数据范围不加个0