莫比乌斯反演 & 狄利克雷卷积
P1829 [国家集训队]Crash的数字表格#
Ans=i=1∑nj=1∑mlcm(i,j)=i=1∑nj=1∑mgcd(i,j)i×j=d=1∑min(n,m)i=1∑nj=1∑mdi×j[gcd(i,j)=d]=d=1∑min(n,m)i=1∑⌊dn⌋j=1∑⌊dm⌋d(i⋅d)×(j⋅d)[gcd(i,j)=1]=d=1∑min(n,m)d⋅i=1∑⌊dn⌋j=1∑⌊dm⌋i×j[gcd(i,j)=1]=d=1∑min(n,m)d⋅i=1∑⌊dn⌋j=1∑⌊dm⌋i×jx∣gcd(i,j)∑μ(x)=d=1∑min(n,m)dx=1∑min(⌊dn⌋,⌊dm⌋)μ(x)i=1∑⌊dn⌋j=1∑⌊dm⌋(i×j)[x∣i][x∣j]=d=1∑min(n,m)dx=1∑min(⌊dn⌋,⌊dm⌋)μ(x)⋅x2i=1∑⌊dxn⌋j=1∑⌊dxm⌋(i×j)
前面两个 ∑ 只需预处理 μ(x) 的前缀和,最后两个 ∑ 可以用等差数列 O(1) 算出,于是答案可线性计算。
g(n,m)=i=1∑nj=1∑mi×j=2n(n+1)2m(m+1)
整除分块,复杂度为 i=1∑nin,计算可知,当 n=107 时,左边式子的值 <2×107,可以通过。
注意取模、逆元。
for(int d = 1; d <= min(n, m); d++) {
int t = min(n / d, m / d), tmp = 0;
for(int l = 1, r; l <= t; l = r + 1) {
r = min((n / d) / ((n / d) / l), (m / d) / ((m / d) / l));
(tmp += (mu[r] - mu[l - 1]) % mod * g(n / d / l, m / d / l) % mod) %= mod;
}
ans = (ans + tmp * d % mod) % mod;
}
cpp
P3312 [SDOI2014]数表#
先忽略 a 的限制?
Ans=i=1∑nj=1∑mx=1∑min(n,m)x[x∣i][x∣j]=x=1∑min(n,m)x⌊xn⌋⌊xm⌋
这样虽然形式简单,但并不能继续进行…
换成下面的形式:
Ans=i=1∑nj=1∑mσ(gcd(i,j))=d=1∑ni=1∑nj=1∑mσ(d)[gcd(i,j)=d]=d=1∑min(n,m)σ(d)i=1∑⌊dn⌋j=1∑⌊dm⌋[gcd(i,j)=1]=d=1∑min(n,m)σ(d)i=1∑⌊dn⌋j=1∑⌊dm⌋x∣gcd(i,j)∑μ(x)=d=1∑min(n,m)σ(d)i=1∑⌊dn⌋j=1∑⌊dm⌋x∑min(⌊dn⌋,⌊dm⌋)μ(x)[x∣i][x∣j]=d=1∑min(n,m)σ(d)x∑min(⌊dn⌋,⌊dm⌋)μ(x)i=1∑⌊dn⌋[x∣i]j=1∑⌊dm⌋[x∣j]=d=1∑min(n,m)σ(d)x∑min(⌊dn⌋,⌊dm⌋)μ(x)i=1∑⌊dxn⌋1j=1∑⌊dxm⌋1=d=1∑min(n,m)σ(d)x∑min(⌊dn⌋,⌊dm⌋)μ(x)⌊dxn⌋⌊dxm⌋
记 t=dx,则可以更改枚举顺序,继续简化:
Ans=d=1∑min(n,m)σ(d)x∑min(⌊dn⌋,⌊dm⌋)μ(x)⌊dxn⌋⌊dxm⌋=t=1∑n⌊tn⌋⌊tm⌋d∣t∑σ(d)μ(dt)
观察推导过程,可知当 σ(d)≤a 时才会对答案有贡献。
设 g(t)=∑d∣tσ(d)μ(dt).
以 a 为关键字,从小到大枚举询问。a 变大时,有一些 g(t) 的值需要增加,可以直接枚举新加入的数的所有倍数,来找到所有被贡献的 t.
用树状数组维护 g(t),时间复杂度为 O(qnlogn+nlog2n).
P3455 [POI2007]ZAP-Queries#
Ans=i=1∑aj=1∑b[gcd(i,j)=d]=i=1∑⌊da⌋j=1∑⌊db⌋[gcd(i,j)=1]=i=1∑⌊da⌋j=1∑⌊db⌋d∣gcd(i,j)∑μ(d)=i=1∑⌊da⌋j=1∑⌊db⌋x=1∑min(⌊da⌋,⌊db⌋)μ(x)[d∣i][d∣j]=x=1∑min(⌊da⌋,⌊db⌋)μ(x)i=1∑⌊da⌋[d∣i]j=1∑⌊db⌋[d∣j]=x=1∑min(⌊da⌋,⌊db⌋)μ(x)⌊xda⌋⌊xdb⌋
P3172 [CQOI2015]选数#
Ans=a1=L∑ha2=L∑h⋯an=L∑h[gcd(a1,a2⋯,an)=k]=a1=⌈kl⌉∑⌊kh⌋a2=⌈kl⌉∑⌊kh⌋⋯an=⌈kl⌉∑⌊kh⌋[gcd(a1,a2⋯an)=1]=a1=⌈kl⌉∑⌊kh⌋a2=⌈kl⌉∑⌊kh⌋⋯an=⌈kl⌉∑⌊kh⌋d∣gcd(a1,a2⋯an)∑μ(d)=a1=⌈kl⌉∑⌊kh⌋a2=⌈kl⌉∑⌊kh⌋⋯an=⌈kl⌉∑⌊kh⌋⋅d=1∑⌊kh⌋μ(d)[d∣a1][d∣a2]⋯[d∣an]=d=1∑⌊kh⌋μ(d)⋅a1=⌈kl⌉∑⌊kh⌋[d∣a1]⋅a2=⌈kl⌉∑⌊kh⌋[d∣a2]⋯an=⌈kl⌉∑⌊kh⌋[d∣an]=d=1∑⌊kh⌋μ(d)⋅a1=⌊kl−1⌋+1∑⌊kh⌋[d∣a1]⋅a2=⌊kl−1⌋+1∑⌊kh⌋[d∣a2]⋯an=⌊kl−1⌋+1∑⌊kh⌋[d∣an]=d=1∑⌊kh⌋μ(d)⋅(⌊kdh⌋−⌊kdl−1⌋)n
杜教筛、整除分块。
P6810 「MCOI-02」Convex Hull 凸包#
Ans=i=1∑nj=1∑mτ(i)τ(j)τ(gcd(i,j))=x=1∑min(n,m)τ(x)i=1∑nj=1∑mτ(i)τ(j)[gcd(i,j)=x]=x=1∑min(n,m)τ(x)i=1∑⌊xn⌋j=1∑⌊xm⌋τ(xi)τ(xj)[gcd(i,j)=1]=x=1∑min(n,m)τ(x)i=1∑⌊xn⌋j=1∑⌊xm⌋τ(xi)τ(xj)d∣gcd(i,j)∑μ(d)=x=1∑min(n,m)τ(x)i=1∑⌊xn⌋j=1∑⌊xm⌋τ(xi)τ(xj)d=1∑⌊xmin(n,m)⌋μ(d)[d∣i][d∣j]=x=1∑min(n,m)τ(x)d=1∑⌊xmin(n,m)⌋μ(d)i=1∑⌊xn⌋[d∣i]τ(xi)j=1∑⌊xm⌋[d∣j]τ(xj)=x=1∑min(n,m)τ(x)d=1∑⌊xmin(n,m)⌋μ(d)i=1∑⌊xdn⌋τ(xid)j=1∑⌊xdm⌋τ(xjd)
对于 x=1∑min(n,m)τ(x)d=1∑⌊xmin(n,m)⌋μ(d),暴力循环枚举即可。复杂度用调和级数算,是 O(nlnn).
对于 i=1∑⌊xdn⌋τ(xid)j=1∑⌊xdm⌋τ(xjd),可以在预处理后 O(1) 计算。
先线性筛出所有的 τ(x),预处理出 s(x,y)=i=1∑yτ(xi).
若 x 固定,则 y∈[1,⌊xmin(n,m)⌋],所以预处理的复杂度也是 O(nlnn) 级别的。
这tm会被卡常。
所以有更简单的推导方法:
Ans=i=1∑nj=1∑mτ(i)τ(j)τ(gcd(i,j))=i=1∑nj=1∑mτ(i)τ(j)d∣gcd(i,j)∑1=d=1∑n⋅i=1∑n[d∣i]τ(i)⋅j=1∑n[d∣j]τ(j)=d=1∑n⋅i=1∑⌊dn⌋τ(id)⋅j=1∑⌊dm⌋τ(jd)
预处理出 i=1∑⌊dn⌋τ(id) 即可。
P3704 [SDOI2017]数字表格#
Ans=i=1∏nj=1∏mfgcd(i,j)=d=1∏min(n,m)fd∑i=1n∑j=1m[gcd(i,j)=d]
其中:
=i=1∑nj=1∑m[gcd(i,j)=d]=x=1∑min(n/d,m/d)μ(x)i=1∑n/d[x∣i]j=1∑m/d[x∣j]=x=1∑min(n/d,m/d)μ(x)(n/dx)(m/dx)
继续:
Ans=d=1∏min(n,m)fdi=1∑nj=1∑m[gcd(i,j)=d]=d=1∏min(n,m)fdx=1∑min(n/d,m/d)μ(x)(n/dx)(m/dx)
常见套路,设 t=dx,则:
Ans=d=1∏min(n,m)fdx=1∑min(n/d,m/d)μ(x)(n/dx)(m/dx)=t=1∏min(n,m)d∣t∏fdμ(t/d)(n/t)(m/t)=t=1∏min(n,m)d∣t∏(fdμ(t/d))(n/t)(m/t)
设 gt=∏d∣tfdμ(t/d),则:
Ans=t=1∏min(n,m)d∣t∏(fdμ(t/d))(n/t)(m/t)=t=1∏min(n,m)gt(n/t)(m/t)
枚举每个 d,预处理出 gt 数组,复杂度为调和级数 1n+2n+⋯+nn=nlnn.
多测,对每次询问,利用数论分块计算 Ans,需要先算出 gt 的前缀积。
时间复杂度为 O(tn+nlnn).
注意:代码取模时,指数部分要 mod(p−1) 而不是 modp,由费马小定理知 ap−1≡a0(modp).
P2257 YY的GCD#
Ans=i=1∑nj=1∑mp=1∑min(n,m)[gcd(i,j)=p],p∈prime=p=1∑min(n,m)i=1∑⌊pn⌋j=1∑⌊pm⌋[gcd(i,j)=1],p∈prime=p=1∑min(n,m)i=1∑⌊pn⌋j=1∑⌊pm⌋x∣gcd(i,j)∑μ(x),p∈prime=p=1∑min(n,m)x=1∑min(⌊pn⌋,⌊pm⌋)μ(x)⌊pxn⌋⋅⌊pxm⌋,p∈prime
设 t=px,
Ans=p=1∑min(n,m)x=1∑min(⌊pn⌋,⌊pm⌋)μ(x)⌊pxn⌋⌊pxm⌋,p∈prime=t=1∑min(n,m)⌊tn⌋⌊tm⌋x∣t∑μ(x),xt∈prime=t=1∑min(n,m)⌊tn⌋⌊tm⌋x∣t∑μ(xt),x∈prime
P3911 最小公倍数之和#
Ans=i=1∑nj=1∑nlcm(Ai,Aj)=i=1∑nj=1∑ngcd(Ai,Aj)AiAj=i=1∑nj=1∑nd=1∑mdAiAj[gcd(Ai,Aj)=d]=i=1∑ndAij=1∑ndAjd=1∑md1[gcd(Ai,Aj)=1]
上面是错的。
设 ci 为 i 在 A 中出现的次数,值域为 [1,m],则:
Ans=i=1∑nj=1∑nlcm(Ai,Aj)=i=1∑mj=1∑mlcm(i,j)⋅cicj=i=1∑mj=1∑mgcd(i,j)i⋅j⋅cicj=i=1∑mi⋅cij=1∑mj⋅cjd=1∑md1[gcd(i,j)=d]=d=1∑md1i=1∑m/ddi⋅cdij=1∑m/ddj⋅cdj[gcd(i,j)=1]=d=1∑md1i=1∑m/ddi⋅cdij=1∑m/ddj⋅cdjx=1∑m/dμ(x)=d=1∑md1x=1∑m/dμ(x)i=1∑m/dxdxi⋅cdxij=1∑m/dxdxj⋅cdxj
预处理 f(t)=i=1∑m/tti⋅cti.
Ans=d=1∑md1x=1∑m/dμ(x)i=1∑m/dxdxi⋅cdxij=1∑m/dxdxj⋅cdxj=d=1∑md1x=1∑m/dμ(x)[f(dx)]2