版权声明:转载注明出处,谢谢,有问题可以向博主联系 https://blog.csdn.net/VictoryCzt/article/details/85063317
前面的讲解【Blog地址】
题目意思:求
i=1∑nj=1∑mlcm(i,j)
对于数据范围
n,m≤1010。
其实我们前面将式子化简成了:
=d=1∑ndw=1∑⌊dn⌋μ(w)w2S(⌊dwn⌋)S(⌊dwn⌋)
其中
S(n)=2n×(n+1)
其实这个时候我们用杜教筛筛
∑i=1nμ(i)i2即可在
O(n43)时间内做出(分块套分块再加杜教筛)。
对于
f(x)=μ(x)x2的前缀和
F(n),我们可以根据杜教筛的套路,令
g(x)=x2,那么
h=f⨂g就等于(
⨂为狄利克雷卷积):
=d∣n∑μ(d)d2(dn)2=n2d∣n∑μ(d)=n2[n=1]=[n=1]
此时带入杜教筛公式即可得,其中后面要除以
g(1),但因为
g(1)=1这里略去:
F(n)=i=1∑nh(i)−i=2∑ng(i)F(⌊in⌋)=1−i=2∑ni2F(⌊in⌋)
就可以直接递归筛了。
但是我们可以继续看,转而枚举乘积
dw,令
T=dw则可以得到原式等于:
=T=1∑nS(⌊Tn⌋)S(⌊Tm⌋)d∣T∑nμ(d)d2(dT)=T=1∑nS(⌊Tn⌋)S(⌊Tm⌋)Td∣T∑μ(d)d
那么我们只需要杜教筛出后面
T∑d∣Tμ(d)d即可分块加杜教筛,在
O(n32)的时间内做出。
但是如何筛后面的那个呢?
我们来看,现在相当于求这个式子:
d=1∑ndw∣d∑μ(w)w
由于前面的式子和现在这个求出来的值是一样的,也就是:
d=1∑ndw=1∑⌊dn⌋μ(w)w2S(⌊dwn⌋)S(⌊dwn⌋)=T=1∑nS(⌊Tn⌋)S(⌊Tm⌋)Td∣T∑μ(d)d
所以我们可以将
S相同的部分减去,那么剩下就是:
d=1∑ndw=1∑⌊dn⌋μ(w)w2=T=1∑nTd∣T∑μ(d)d
所以相当于筛前面的那个东西,我们预处理线性筛出一部分
∑T=1nT∑d∣Tμ(d)d的这个,然后用杜教筛加分块继续求前面的那个即可。
另外一种解释:
相当于我们后面需要杜教筛的
d∑w∣dμ(w)w=∑w∣dμ(w)w2wd
写成狄利克雷卷积的形式就是
(id2⋅μ)⨂id,我们令
f=(id2⋅μ)⨂id,g=id2,那么
f⨂g=(id2⋅μ)⨂id⨂id2,交换一下就是
(id2⋅μ)⨂id2⨂id,前两个卷出来就是
ϵ,然后原式就变成
ϵ⨂id=id,然后杜教筛即可。
公式即为:
F(n)=i=1∑ni−i=2∑ni2F(⌊in⌋)
我觉得上面这种更好
代码,咕咕咕
参考资料博客: