BZOJ 3309 DZY Love Math

来源:互联网 发布:成都 人工智能 招聘 编辑:程序博客网 时间:2024/09/21 09:25

题目大意:求:ni=1mj=1f(gcd(i,j))
其中f(x)表示x的质因数分解中,最大的指数。特殊的,f(1)=0。n,m<=1e7, T<=1e3。
题解:
首先考虑莫比乌斯反演,下文设n<=m:
首先转为枚举最大公因数:

i=1nj=1mf(gcd(i,j))

=d=1nf(d)i=1nj=1m[gcd(i,j)==d]

=d=1nf(d)i=1[nd]j=1[md][gcd(i,j)==1]

=d=1nf(d)i=1[nd]j=1[md]e|gcd(i,j)μ(e)

=d=1nf(d)e=1[nd]μ(e)[nde][mde]

转而枚举T=de
=T=1n[nT][mT]d|Tf(d)μ(Td)

=T=1n[nT][mT]g(T)

其中g函数是f和μ函数的卷积。至此,如果能够在合适的时间内预处理出g函数,既可以用数论分块在O(n)的时间内回答每一次询问。注意到f函数是可以在线性时间内求出f和μ,然后枚举x和y,使g(xy)+=f(x)μ(y)即可做到O(nlgn)的复杂度下求出g。但这并不能胜任本题。
考虑我们实际上上述推导并未使用f函数的性质。考虑观察f函数和μ函数的卷积的性质。
我们知道μ函数的取值只可能是1,-1,0中的某些,因而相当于是给f函数前加上系数。显然那些系数是0的部分不需要考虑。在这里μ函数就有一个非常好的性质:当n中又平方质因子的时候μ(n)=0
这就给我们提供了方便。考虑g(n),并不妨设n=Πki=1paii。注意到如果想使f(d)的函数值能够取到,必须有d中的质因子指数与n个质因子指数相差不超过1,否则Td就会含有平方质因子,f(d)就不会被统计。因此,显然有很大可能,f(d)的值取到了n的指数中最大的那一个。事实上,稍微仔细思考一下,不妨设a=maxki=1ai,并且为方便叙述上述n的质因子分解中对每一个质数及其质数重新排序,满足a=a1=a2=...=ax>ax+1>=ax+2...>=ak
那么f函数的值要么取到a,要么取到a-1。两种情况分别来看。

第一种:什么时候f函数能够取到a呢?显然,在a1...ax中,有至少一个指数是d达到a的,而后面的ax+1...ak就是随便选。这显然就是一个容斥问题,不难发现,如果枚举d的质因数分解中,有哪几项的次数达到了a,那么可以列出一下式子:

g1(n)=ai=1xCixj=0kxCjkx(1)kij

=ai=1xCix(1)xij=0kxCjkx(1)kxj1j

=ai=1xCix(1)xi[kx==0]

显然如果k不等于x那么g1(n)=0.
否则如果k=n会有:
g1(n)=a[i=0xCix(1)xi1i]aC0x(1)x

由于显然x>=1,有:
g1(n)=a(1)x+1=(1)k+1a

第二种情况,什么时候f函数取到a-1呢?这个情况相对简单,即当d的质因子中,p1...px的指数全部没有取满,此时会有:

g2(n)=(a1)(1)xj=0kxCjkx(1)kxj

g2(n)=(a1)(1)x[k==x]

显然如果k和x不相等那么g2(n)也会等于0.
否则,有:
g2(n)=(a1)(1)x=a(1)x(1)x
=a(1)k+1(1)k

因此,如果k不等于x,那么g(n)=g1(n)+g2(n)=0+0=0。
否则:
g(n)=g1(n)+g2(n)
=(1)k+1a(1)k+1a(1)k
=(1)k+1

综上,我们知道k=x代表着每一项的次数都是一样的,因此把把那些μ(x)不等于0的x取出来做高次幂计算g函数即可。易知这样做显然每个数字最多被计算一次,复杂度是线性的。
至此我们成功的解决了这道题。