whx1003神仙blog
这里主要是一些题目以及常见套路
首先是莫比乌斯反演的柿子
[f(n)=sum_{d|n}g(d)leftrightarrow g(n)=sum_{d|n}mu(frac nd)f(d)\
f(n)=sum_{n|d}g(d)leftrightarrow g(n)=sum_{n|d}mu(frac dn)f(d)
]
其实用的最多的还是这个柿子
[sum_{d|n}mu(d)=[n=1]
]
更具体一点是这个东西
[sum_{d|i,d|j}mu(d)=[gcd(i,j)=1]
]
好了,那我们就开始吧
首先莫比乌斯反演考察的不是公式本身,而是数学推导
于是先从这里开始
求
[sum_{i = 1}^n sum_{j = 1}^m sigma_0(i) sigma_0(j) sigma_0(gcd(i, j))\
n,mle 10^6
]
其中(sigma_0(n))表示(n)的约数个数
我们可以做如下推导:
[=sum_{i=1}^nsum_{j=1}^msigma_0(i)sigma_0(j)sum_{d|i,d|j}1\
=sum_{d=1}^{min(n,m)}(sum_{d|i}^nsigma_0(i))(sum_{d|j}^msigma_0(j))
]
第一步是根据定义,第二步是交换和式(这个东西多推推柿子就会了)
然后我们可以枚举(d),后面的东西暴力统计一遍,时间复杂度为(mathcal O(nln n))
好的,再来康康这道题
求
[sum_{i=1}^nsum_{j=1}^n[gcd(i,j)=1]\
nle 2 imes 10^6
]
sol.
[=sum_{i=1}^nsum_{j=1}^nsum_{d|i,d|j}mu(d)\
=sum_{d=1}^nmu(d)sum_{d|i}^nsum_{d|j}^n\
=sum_{d=1}^nmu(d)lfloor frac nd
floor^2
]
枚举(d)就可以(mathcal O(n))计算了,如果整除分块可以做到(mathcal O(sqrt n))可以应付多组询问
稍微变式
求
[sum_{i=1}^nsum_{j=1}^ngcd(i,j)\
nle 2 imes 10^6
]
sol.
[=sum_{i=1}^nsum_{j=1}^nsum_{d|i,d|j}varphi(d)\
=sum_{d=1}^nvarphi(d)sum_{d|i}^nsum_{d|j}^n\
=sum_{d=1}^nvarphi(d)lfloor frac nd
floor^2
]
这里主要是用到了这个柿子
[sum_{d|n}varphi(d)=n
]
当然你也可以枚举(gcd)然后用莫反公式硬推,后面会有类似的做法
小练习:1 2
求
[sum_{i=1}^nsum_{j=1}^mlcm(i,j)\
n,mle 10^7
]
sol.
[=sum_{i=1}^nsum_{j=1}^mfrac{ij}{gcd(i,j)}\
=sum_{d=1}^{min(n,m)}sum_{d|i}^nsum_{d|j}^mfrac{ij}d[gcd(i,j)=d]\
=sum_{d=1}^{min(n,m)}sum_{d|i}^nsum_{d|j}^mfrac{ij}d[gcd(frac id,frac jd)=1]
]
不妨令(i`=frac id,j`=frac jd)
那么
[=sum_{d=1}^{min(n,m)}dsum_{i`=1}^{lfloor frac nd
floor}sum_{j`=1}^{lfloor frac md
floor}i`j`[gcd(i`,j`)=d]\
=sum_{d=1}^{min(n,m)}dsum_{i`=1}^{lfloor frac nd
floor}sum_{j`=1}^{lfloor frac md
floor}i`j`sum_{w|i`,w|j`}mu(w)\
=sum_{d=1}^{min(n,m)}dsum_{w=1}^{lfloor frac n{dw}
floor}mu(w)sum_{w|i`}^{lfloor frac nd
floor}sum_{w|j`}^{lfloor frac md
floor}i`j`\
=sum_{d=1}^{min(n,m)}dsum_{w=1}^{lfloor frac n{dw}
floor}mu(w)w^2sum_{i=1}^{lfloor frac n{dw}
floor}sum_{j=1}^{lfloor frac m{dw}
floor}ij\
=sum_{d=1}^{min(n,m)}dsum_{w=1}^{lfloor frac n{dw}
floor}mu(w)w^2(sum_{i=1}^{lfloor frac n{dw}
floor}i)(sum_{j=1}^{lfloor frac m{dw}
floor}j)\
]
不妨令(S(n)=sum_{i=1}^ni=frac {n(n+1)}2)
那么
[=sum_{d=1}^{min(n,m)}dsum_{w=1}^{lfloor frac n{dw}
floor}mu(w)w^2S(lfloorfrac n{dw}
floor)S(lfloorfrac m{dw}
floor)\
]
令(T=dw),那么
[=sum_{T=1}^{min(n,m)}sum_{d|T}dmu(frac Td)(frac Td)^2S(lfloor frac nT
floor)S(lfloor frac mT
floor)
]
显然(sum_{d|T}dmu(frac Td)(frac Td)^2)是一个卷积的柿子,因此是积性的,可以用线性筛筛出
然后后面就是一个整除分块的柿子,直接做就可以了
来个稍微轻松一点的
求
[sum_{i=1}^nsum_{j=1}^m[gcd(i,j)in P]\
其中P表示所有质数的集合
]
sol.
[=sum_{din P}sum_{d|i}^nsum_{d|j}^m[gcd(frac id,frac jd)=1]\
=sum_{din P}sum_{i=1}^{lfloor frac nd
floor}sum_{j=1}^{lfloor frac md
floor}[gcd(i,j)=1]\
=sum_{din P}sum_{i=1}^{lfloor frac nd
floor}sum_{j=1}^{lfloor frac md
floor}sum_{w|i,w|j}mu(w)\
=sum_{din P}sum_{w=1}mu(w)lfloor frac n{dw}
floorlfloorfrac m{dw}
floor
]
令(T=dw)
[=sum_{T=1}lfloor frac nT
floorlfloorfrac mT
floorsum_{d|T,din P}mu(frac Td)
]
前面整除分块,后面直接暴力
但其实后面也可以线性筛(虽然它并不是积性函数)
具体如何筛,这位大佬有详细讲解
这个题目告诉我们线性筛不只能筛积性函数
只要是能够快速递推求出当新加入一个最小素因子时的点值的数论函数都可以求解
结论题
求
[sum_{i=1}^nsum_{j=1}^md(ij)
]
我们有结论
[d(ij)=sum_{x|i}sum_{y|j}[gcd(x,y)=1]
]
简单证明
对于质数(p),不妨设(i)中有(p^a),(j)中有(p^b)
现在考虑要选出(p^k(kin [0,a+b]))
如果(kle a),则在(i)中选出,对应到((x,y))则为((p^a,1))
否则我们强制选满(i)中的(p),在(j)中选(p^{k-a}),对应到((x,y))则为((p^{a-min(a,k-a)},p^{k-a-min(a,k-a)}))
对于每一个质数都如是考虑,显然成立
于是
[=sum_{i=1}^nsum_{j=1}^msum_{x|i}sum_{y|i}[gcd(x,y)=1]\
=sum_{x=1}^nsum_{y=1}^m[gcd(x,y)=1]sum_{x|i}sum_{y|i}1\
=sum_{x=1}^nsum_{y=1}^mlfloorfrac nx
floorlfloorfrac my
floor[gcd(x,y)=1]\
=sum_{x=1}^nsum_{y=1}^mlfloorfrac nx
floorlfloorfrac my
floorsum_{d|x,d|y}mu(d)\
=sum_{d=1}^{min(n,m)}mu(d)sum_{d|x}lfloorfrac nx
floorsum_{d|y}lfloorfrac my
floor\
=sum_{d=1}^{min(n,m)}mu(d)sum_{i=1}^{lfloorfrac nd
floor}lfloorfrac n{di}
floorsum_{j=1}^{lfloorfrac md
floor}lfloorfrac m{di}
floor\
=sum_{d=1}^{min(n,m)}mu(d)sum_{i=1}^{lfloorfrac nd
floor}lfloorfrac{lfloorfrac nd
floor}i
floorsum_{j=1}^{lfloorfrac md
floor}lfloorfrac{lfloorfrac md
floor}j
floor
]
不妨设(f(p)=sum_{i=1}^plfloorfrac pi
floor),那么
[=sum_{d=1}^{min(n,m)}mu(d)f(lfloorfrac nd
floor)f(lfloorfrac md
floor)
]
显然(f)可以整除分块预处理,这个柿子本身也可以整除分块,那么此题就结束了
莫反最后一题
求
[sum_{i=1}^nsum_{j=1}^m[sigma_1(gcd(i,j))le a]sigma_1(gcd(i,j))
]
有(2 imes 10^4)组询问,每次(a)重新给定,(n,mle 10^5)
sol.
[=sum_{d=1}^{min(n,m)}sum_{d|i}^nsum_{d|j}^m[gcd(frac id,frac jd)=1][sigma_1(d)le a]sigma_1(d)\
=sum_{d=1}^{min(n,m)}[sigma_1(d)le a]sigma_1(d)sum_{i=1}^{lfloorfrac nd
floor}sum_{j=1}^{lfloorfrac md
floor}sum_{w|i,w|j}mu(w)\
=sum_{d=1}^{min(n,m)}[sigma_1(d)le a]sigma_1(d)sum_{w=1}mu(w)lfloorfrac n{dw}
floorlfloorfrac m{dw}
floor\
=sum_{T=1}^{min(n,m)}lfloorfrac nT
floorlfloorfrac mT
floorsum_{d|T}[sigma_1(d)le a]sigma_1(d)mu(frac Td)\
]
令(g(T)=sum_{d|T}[sigma_1(d)le a]sigma_1(d)mu(frac Td))
可以发现只有(sigma_1(d)le a)时(sigma_1(d)mu(frac Td))才会对(g(T))产生贡献
于是可以将所有的询问离线下来后按照(a)进行排序
然后当(a)增大时,我们就枚举倍数依次加入这些贡献
于是需要一个支持单点修改区间查询(因为整除分块需要)的数据结构,树状数组是一个不错的选择