1 条题解
-
0
自动搬运
来自洛谷,原作者为

Y_B_X
...搬运于
2025-08-24 22:40:15,当前版本为作者最后更新于2022-10-05 23:02:13,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题意: 给定 ,求 $\displaystyle \left(\sum_{i=1}^n\sum_{j=1}^md(ij)\varphi(ij)\right)\bmod 10^9+7$。
不妨设 。
$$=\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) $$由于 等价于 ,枚举 。
$$\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] $$直接枚举 及 ,再枚举 的复杂度是:
$\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)$
所以只需对 快速求出 $\displaystyle \sum_{T=1}^nf(T)[\operatorname{lcm}(t,T)=x]$。
但其实我们只需对 非零的 求值。
再观察一下 $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}$,也即 仅在 非零时有值。
既然 $\mu(t)\neq 0,\mu(T)\neq 0,x=\operatorname{lcm}(t,T)$,则 。
所以我们只需要没有平方因子的 ,求出 $\displaystyle \sum_{T=1}^nf(T)[\operatorname{lcm}(t,T)=x]$。
设 的质因子集合分别为 ,则 且条件充要。
所以 必由 的全部元素与 的一部分拼成。
因此 $\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)$。
最后面的 就相当于 中的元素可选可不选。
另设积性函数 $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)$。
线性预处理出 ,便可 做完了,空间线性。
核心代码:
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。但再仔细观察一下,把每次处理的 的倍数拉出来,
我们发现在对于 的 做的事无非是一个整除的后缀和。
因为在 时,。
所以这部分能被一个 后缀和优化掉。
总时间复杂度降至 ,虽然在数据范围只有 时没太大区别。
核心代码:
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。
- 1
信息
- ID
- 7866
- 时间
- 1500ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者