莫比乌斯反演练习

有用的结论:
1、若(f(n),g(n))均为积性函数,则(h_1(n)=f(n)g(n),h_2(n)=f*g)均为积性函数((f*g)表示两个函数的狄利克雷卷积)

2、(sigma_0(xy)= sum_{i|x}sum_{j|y}[gcd(i,j)=1])

证明:考虑将(xy)的每一个因数的一个映射.

(xy=prod_{i=1}^m p_i^{alpha_i}(alpha _i>0),x=prod p_i^{gamma_i}(gamma_igeq 0); d|xy)(d=prod_{i=1}^m p_i^{eta_i}(eta_igeq 0)).那么对于(d),若将它映射到了两个数(s,t):对于它的每一个质因子(p_i)
(1) 若(eta_ileq gamma_i),那么(p^{eta_i})就对(s)有贡献.
(2)若(eta_i> gamma_i),那么(t)就有一个(p_i^{eta_i-gamma_i})的贡献.

最后将所有贡献相乘得到(s,t).

这样对(xy)的每一个质因子(p_i)(p_i|s)(p_i|t)至多只有一个成立,于是我们通过构造了一个一一映射的方式证明了上述定理.

Sample 1

给定(n,m,d),求

[sum_{i=1}^nsum_{j=1}^m [gcd(i,j)=d] ]

sol:

[egin{aligned} &sum_{i=1}^nsum_{j=1}^m [gcd(i,j)=d]\ =&sum_{i=1}^{lfloorfrac{n}{d} floor}sum_{j=1}^{lfloorfrac{m}{d} floor}[gcd(i,j)=1]\ =&sum_{i=1}^{lfloorfrac{n}{d} floor}sum_{j=1}^{lfloorfrac{m}{d} floor}sum_{k|gcd(i,j)}mu(k)\ =&sum_{k=1}^{lfloorfrac{n}{d} floor}mu(k)lfloorfrac{n}{kd} floorlfloorfrac{m}{kd} floor end{aligned} ]

大力数论分块就完事了.

Sample 2

给定(n,m)

[sum_{i=1}^n sum_{j=1}^m gcd(i,j) ]

直接用(varphi)进行反演的话就十分的easy

[egin{aligned} &sum_{i=1}^nsum_{j=1}^m gcd(i,j)\ =&sum_{i=1}^nsum_{j=1}^m sum_{d|gcd(i,j)} varphi(d)\ =&sum_{d=1}^nvarphi(d)lfloorfrac{n}{d} floorlfloorfrac{m}{d} floor end{aligned} ]

直接数论分块就完事了,但是我们如果按照以往使用(mu)的话

[egin{aligned} &sum_{i=1}^nsum_{j=1}^m gcd(i,j)\ =&sum_{d=1}^ndsum_{i=1}^msum_{j=1}^m[gcd(i,j)=d]\ =&sum_{d=1}^ndsum_{k=1}^{lfloorfrac{n}{d} floor}mu(k)lfloorfrac{n}{kd} floorlfloorfrac{m}{kd} floor end{aligned} ]

直接做看起来是(O(nsqrt n))的,无法应对多组询问.这里有一个经典套路:我们设(T=dk),则:

[egin{aligned} &sum_{d=1}^ndsum_{k=1}^{lfloorfrac{n}{d} floor}mu(k)lfloorfrac{n}{kd} floorlfloorfrac{m}{kd} floor\ =&sum_{T=1}^nlfloorfrac{n}{T} floorlfloorfrac{m}{T} floorsum_{d|T}mu(d)frac{T}{d} end{aligned} ]

(f(T)=sum_{d|T}mu(d)frac{T}{d}),显然(f(T)=mu *id),于是(f)积性,可以直接大力线筛了

这里其实可以观察到(sum_{d|T}mu(d)frac{T}{d}=varphi(T)),本质就是个容斥原理数(1-n)中与(n)互质的数,写成卷积的形式就是(id*mu=varphi)

Sample 3

bzoj3529

先丢掉(a)的限制,就是求

[sum_{i=1}^nsum_{j=1}^msigma_1(gcd(i,j)) ]

化一下式子可以得到

[egin{aligned} &sum_{i=1}^nsum_{j=1}^msigma_1(gcd(i,j))\ =&sum_{d=1}^n sigma_1(d) sum_{i=1}^nsum_{j=1}^m [gcd(i,j)=d]\ =&sum_{d=1}^nsigma_1(d)sum_{k=1}^{lfloorfrac{n}{d} floor}mu(k)lfloorfrac{n}{kd} floorlfloorfrac{m}{kd} floor end{aligned} ]

好了,如果你还记得上面那个题,就知道这里肯定还要换元,设(T=dk)

[egin{aligned} &sum_{d=1}^nsigma_1(d)sum_{k=1}^{lfloorfrac{n}{d} floor}mu(k)lfloorfrac{n}{kd} floorlfloorfrac{m}{kd} floor\ =&sum_{T=1}^nlfloorfrac{n}{T} floorlfloorfrac{m}{T} floorsum_{d|T}sigma_1(d)mu(frac{T}{d}) end{aligned} ]

(f(T)=sum_{d|T}sigma_1(d)mu(frac{T}{d})=sigma_1*mu),显然积性,但是由于数据小所以直接(O(nlog_2 n))筛就完事了

那么就回来考虑(a)的限制,也就是只有(sigma_1(d)leq a)(d)才会对答案有贡献,我们可以将(sigma_1(d))从小到大排序,同时将询问按照(a)的大小排序,每次将所有(sigma_1(d)leq a)(d)枚举其倍数更新贡献,这个可以用树状数组维护,之后直接(O(sqrt n))回答询问即可

Sample 4

bzoj3994

给定(n,m),求

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

sol:
根据本文最开始的结论,有

[egin{aligned} &sum_{i=1}^nsum_{j=1}^msigma_0(ij)\ =&sum_{i=1}^nsum_{j=1}^msum_{x|i}sum_{y|j}[gcd(x,y)=1]\ =&sum_{x=1}^nsum_{y=1}^m{lfloorfrac{n}{x} floor}{lfloorfrac{m}{y} floor}[gcd(x,y)=1]\ =&sum_{x=1}^nsum_{y=1}^m{lfloorfrac{n}{x} floor}{lfloorfrac{m}{y} floor}sum_{d|gcd(x,y)} mu(d)\ =&sum_{d=1}^nmu(d)sum_{x=1}^{lfloorfrac{n}{d} floor}sum_{y=1}^{lfloorfrac{m}{d} floor} lfloorfrac{n}{xd} floorlfloorfrac{m}{yd} floor end{aligned} ]

这里的问题是,我们并不能像之前那样令(T=xd),原因是这样的话(yd)会变得非常棘手,我们需要考虑一些更本质的东西。

(f(n)=sum_{i=1}^nlfloorfrac{n}{i} floor),那么最终的答案可以写作

[sum_{d=1}^nmu(d)f(lfloorfrac{n}{d} floor)f(lfloorfrac{m}{d} floor) ]

现在考虑如何快速求(f(n)),把(f(n))看做每次枚举一个因数(i),数一下有多少个数是它的倍数且(leq n),于是不难发现(f(n)=sum_{i=1}^nsigma_0(i)),于是我们先(O(nlog_2n))求出(sigma_0(n)),再求其前缀和(f),最后套数论分块即可。

原文地址:https://www.cnblogs.com/encodetalker/p/12063149.html