【题目大意】
求∑i=1n∑d|igcd(d,id)
【20%】n<=105
暴力枚举i,然后根号枚举
时间复杂度O(nn√)
【50%】n<=107
双sigma带gcd的形式考虑反演。
∑i=1n∑d|igcd(d,id)
=∑d=1n√d∗f(d),其中f(d)=∑i=1n∑j|i(gcd(j,ij)==d)
接下来我们考虑如何快速求f(d),方法众多,这里介绍一种非Mobius的方法。
由于i分解成两个因数之后,两个因数都要含因子
我们现在其实是把ti分解成两个因数,然后两个因数互质。考虑将ti分解质因数,那么对于ti的同一种质因子,td要么将它全选,要么全不选。因此第二个sigma只与ti的质因数种类数有关。设g[ti]表示ti的质因数种类数,则
f(d)=∑ti=1⌊nd2⌋2g[ti]
我们只需预处理g数组即可。
【100%解法1】n<=1011
上述解法的瓶颈在于g[ti]不好求,因为ti最大会达到n,预处理存不下,现场求又慢。所以对于
事实上,求f(d)是Mobius反演的经典问题。
f(d)=∑i=1n∑j|i(gcd(j,ij)==d)
=∑i=1n∑j=1n(gcd(i,j)==d),其中i∗j<=n
令m=⌊nd2⌋,则上式
=∑i=1m∑j=1m(gcd(i,j)==1),其中i∗j<=m
=∑D=1mμ(D)∑t=1⌊mD2⌋⌊mD2t⌋
总式为
∑d=1n√d∗∑D=1⌊nd2⌋μ(D)∑t=1⌊nd2D2⌋⌊nd2D2t⌋
接下来用《莫比乌斯反演(宋新波)》里的一种变形。(参考wc2016课件)
令T=d∗D,则原式为
∑T=1n∑d|Td∗μ(Td)∑t=1⌊nT2⌋⌊nT2t⌋
事实上如果T>n√,则第三个sigma无意义。所以原式为
∑T=1n√G(T)∑t=1⌊nT2⌋⌊nT2t⌋,其中G(T)=∑d|Td∗μ(Td)
显然G数组是可预处理的,第二个sigma可以分块解决。
【100%解法>=2】n<=1011
更多高超的反演姿势请自行脑补。