【题目大意】
求∑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
更多高超的反演姿势请自行脑补。