【51nod1220】约数之和

题目要求的柿子是:

[large sum_{i=1}^nsum_{j=1}^nsigma(ij) ]

小证明:

(i) 选了的 (j) 就必须在“不选集合”中选择“不选”,(i) 没选的 (j) 的 “不选集合” 中就可选可不选。

这样做显然是一一对应的,而且肯定满足 (i) 的“选集合”和 (j) 的“不选集合”互质。

首先根据结论:

[large sum_{i=1}^nsum_{j=1}^nsum_{xvert i}sum_{yvert j}[gcd(x,y)=1]dfrac{xj}{y} ]

先枚举 (x,y)

[large sum_{x=1}^nsum_{y=1}^nsum_{xvert i}sum_{yvert j}[gcd(x,y)=1]dfrac{xj}{y} ]

把只和 (x,y) 相关的提出来:

[large sum_{x=1}^nsum_{y=1}^n[gcd(x,y)=1]dfrac{x}{y}lfloorfrac nx floorsum_{yvert j}j ]

(varepsilon=I*mu) 换一下:

[large sum_{x=1}^nsum_{y=1}^nsum_{dvert gcd(x,y)}mu(d)dfrac{x}{y}lfloorfrac nx floorsum_{yvert j}j ]

套路先枚举 (d) ,同时观察到最后那个柿子就是个等差数列:

[large sum_{d=1}^nmu(d)sum_{x=1}^{lfloorfrac nd floor}sum_{y=1}^{lfloorfrac nd floor}frac{x}ylfloorfrac n{xd} floor yddfrac{lfloorfrac {n}{yd} floor(lfloorfrac {n}{yd} floor+1)}{2} ]

化简一下:

[large sum_{d=1}^nmu(d)sum_{x=1}^{lfloorfrac nd floor}sum_{y=1}^{lfloorfrac nd floor}xdlfloorfrac n{xd} floor dfrac{lfloorfrac {n}{yd} floor(lfloorfrac {n}{yd} floor+1)}{2} ]

把该提出来的提出来:

[large sum_{d=1}^nmu(d)dsum_{x=1}^{lfloorfrac nd floor}xlfloorfrac n{xd} floor sum_{y=1}^{lfloorfrac nd floor}dfrac{lfloorfrac {n}{yd} floor(lfloorfrac {n}{yd} floor+1)}{2} ]

接下来可以考虑怎么解决后面两部分,先说最后一个柿子,为了方便,设 (lfloordfrac nd floor o n)

[large sum_{i=1}^nfrac{lfloorfrac{n}{i} floor(lfloorfrac{n}{i} floor+1)}{2} ]

把后面的柿子换回等差数列的形式,然后交换求和顺序:

[largesum_{i=1}^nsum_{j=1}^{lfloorfrac ni floor}j=sum_{j=1}^njsum_{i=1}^{lfloorfrac nj floor}1=sum_{i=1}^nilfloorfrac ni floor ]

这时我们再来看前面一个柿子,发现这两个柿子现在不是一样的吗?

那么我们现在只需要解决前面的柿子再平方一下就行了。

还是为了方便,设 (lfloordfrac nd floor o n)

[large sum_{i=1}^nilfloorfrac ni floor ]

考虑其实际意义:(large ilfloorfrac ni floor) 的意义就是在 ([1,n]) 当中,(i) 作为因数对其所有倍数的因数和的贡献。

那么对于 ([1,n]) 中所有这样的 (i) ,自然有:

[large sum_{i=1}^nilfloorfrac ni floor=sum_{i=1}^nsigma_{1}(i) ]

那么现在原式就变成了:

[large Ans=sum_{d=1}^nmu(d)dleft(sum_{i=1}^{leftlfloorfrac n i ight floor}sigma_1(i) ight)^2 ]

很容易发现后面的柿子是个整除分块,但是也要计算 (sigma_1) 的前缀和,而前面则是要计算 (mu(d)d) 的前缀和。

考虑杜教筛。

先考虑 (mu(d)d) ,似乎带 (d) 的柿子都可以给它卷个 (id) 使得这个 (d) 被消掉,于是我们试一下:

[large sum_{i=1}^nsum_{dvert i}dcdotmu(frac id)frac id=sum_{i=1}^ni(mu*I)(i)=sum_{i=1}^ni[i=1]=1 ]

非常简洁,那么考虑 (id) 的前缀和好求吗?非常好求,就是等差数列,那么我们就可以筛出 (mu(d)d) 了,接下来考虑 (sigma_{1})

想了一万年,发现并没有什么好的函数来筛 (sigma_{1}) ,但是我们发现,其实如果我们直接爆算,那么就是一个除法分块的复杂度(还记得 (large sumlimits_{i=1}^nsigma_{1}(i)=sumlimits_{i=1}^nilfloorfrac ni floor) 吗)。

但是!这里有个非常高妙的做法:

考虑杜教筛是怎么做到 (O(n^{frac{2}{3}})) 复杂度的:先线性筛出 (n^{frac 23}) 的前缀和,然后剩下的部分除法分块以及递归!

那么我们直接线性筛出这个函数的 (n^{frac23}) ,然后对剩下部分除法分块,复杂度也可以近似为 (n^{frac 23}) ,甚至比杜教筛还要优!(因为还省掉了递归的复杂度,虽然在主定理中这不是瓶颈)

那么就结束了,时间复杂度 (O(n^{frac 23}))

原文地址:https://www.cnblogs.com/Akmaey/p/15220909.html