题目大意
i=1∑nd∣i∑gcd(d,di)
【20%】n≤105
暴力枚举 i,然后根号枚举 d。
时间复杂度 O(nn)
【50%】n≤107
双sigma带gcd的形式考虑反演。
=i=1∑nd∣i∑gcd(d,di)d=1∑nd∗f(d)其中f(d)=i=1∑nj∣i∑(gcd(j,ji)==d)
接下来我们考虑如何快速求 f(d),方法众多,这里介绍一种非Mobius的方法。
由于i分解成两个因数之后,两个因数都要含因子d,因此i本身应该是d2的倍数。所以我们不枚举i,而是直接枚举ti=d2i,相当于j和ji已经同时约去了d。所以
f(d)=ti=1∑⌊d2n⌋td∣ti∑(gcd(td,tdti)==1)
我们现在其实是把 ti 分解成两个因数,然后两个因数互质。考虑将 ti 分解质因数,那么对于 ti 的同一种质因子,td 要么将它全选,要么全不选。因此第二个sigma只与ti的质因数种类数有关。设 g[ti] 表示 ti 的质因数种类数,则
f(d)=ti=1∑⌊d2n⌋2g[ti]
我们只需预处理 g 数组即可。
时间复杂度主要在预处理上,所以是 O(n)。(注意那个⌊d2n⌋,由于分母以平方速度增长,所以整个分数下降速度是很快的)
【100%】n≤1011
上述解法的瓶颈在于g[ti]不好求,因为ti最大会达到n,预处理存不下,现场求又慢。所以对于f(d)我们要换一种求法。
事实上,求f(d)是Mobius反演的经典问题。
f(d)=i=1∑nj∣i∑(gcd(j,ji)==d)=i=1∑nj=1, ij≤n∑n(gcd(i,j)==d)
令m=⌊d2n⌋,则上式
=i=1∑mj=1, ij≤m∑m(gcd(i,j)==1)=D=1∑mμ(D)t=1∑⌊D2m⌋⌊D2tm⌋
总式为
d=1∑nd∗D=1∑⌊d2n⌋μ(D)t=1∑⌊d2D2n⌋⌊d2D2tn⌋
接下来用《莫比乌斯反演(宋新波)》里的一种变形。(参考wc2016课件)
令T=d∗D,则原式为
T=1∑nd∣T∑d∗μ(dT)t=1∑⌊T2n⌋⌊T2tn⌋
事实上如果T>n,则第三个sigma无意义。所以原式为
T=1∑nG(T)t=1∑⌊T2n⌋⌊T2tn⌋,其中G(T)=d∣T∑d∗μ(dT)
显然 G 数组是可预处理的,第二个sigma可以分块解决。
时间复杂度:预处理为 O(n⋅log(n)),最终式子求值为 O(n∗?),?为一个不是很大的常数。(注意那个⌊T2n⌋,由于分母以平方速度增长,所以整个分数下降速度是很快的)