有用的结论:
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),最后套数论分块即可。