约数个数
先看约数的个数:d(n)。
设n=p1a1p2a2…ptat,m∣n,m=p1b1p2b2…ptbt。
m是n的一个约数,每个质因子上方的指数取值为[0,a1],也就是有a1+1种可能,每一个质因子的改变都会产生一个新的约数,所以乘起来就是d(n)=(a1+1)⋅(a2+1)⋅(a3+1)…(at+1)。
暴力求约数和
再来看简单的情况:求σ1(n),即求m每个约数的一次方的和。
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j+=i)
s[i]+=j;
枚举i的倍数j,因此i是j的因数,这样就可以 nlogn 的复杂度求出约数和,下面讲O(n)递推。
线性递推
求σk(m):
代表m的每个约数的k次方的和。
枚举的话我们可以设m=p1a1p2a2p3a3…ptkt(指数大于0)。
那么:
σk(m)=[(p10)k+(p11)k+(p12)k+⋯+(p1a1)k]⋅[(p20)k+(p21)k+(p22)k+⋯+(p2a2)k]⋅[(p30)k+(p31)k+(p32)k+⋯+(p3a3)k]…[(pt0)k+(pt1)k+(pt2)k+⋯+(ptat)k]
也就是σk(m)的定义式,求解这个式子的复杂度是调和级数,约为 nlogn。
这个式子的解释就是对于p1从0∼a1中任选一个指数,对于p2从0∼a2中任选一个指数,……,一直到pt,这样乘起来,这个数一定是m的约数。
我们对每一个p枚举这个指数,实际上就是枚举了所有的m的约数的k次方并把它们求和,这就是这个多项式的意义(不能理解请手动展开)。
我们线性筛的时候,枚举了一个i,使得m=i×p,其中p是m的最小质因子。
我们也把i质因数分解一下:i=p1a1p2a2p3a3⋯ptat(注意此处的i的各个质因子与m的不是同一套)。
然后设mmi=p1a1,代表i质因数分解后的所有最小质因子的乘积,mni=p1,代表i质因数分解后的最小质因子。
开始分类讨论:
- mni!=p
首先mni≥p,这是因为p是m的最小质因子,mni如果比它还小,那么i的最小的质因子也就会被换为p,总之p是最小的,不可能有其它因子比它还小。
mni!=p其实就是mni>p,而mnm=p,因此a1=1,即这项的指数为1。
那么σk(p)=[(p10)k+(p11)k+(p12)k+⋯+(p1a1)k],为前半部分;σk(i)=[(p20)k+(p21)k+(p22)k+⋯+(p2a2)k]⋅[(p30)k+(p31)k+(p32)k+⋯+(p3a3)k]…[(pt0)k+(pt1)k+(pt2)k+⋯+(ptat)k],为后半部分,两者相乘,即σk(m)=σk(p)⋅σk(i)。
- mni=p
- mmi=i
i质因数分解后所有的质因子都是一样的,都是mni,也就是mmi=(mni)a1,设mmi=pz=i,即a1=z。
而mni=p,因此m=i×p=pz+1,也就是说m的质因子现在只有p。
那么根据σm(k)的定义式,σk(m)=(p0)k+(p1)k+(p2)k+(p3)k+⋯+(pz+1)k(因为此时a1=z+1,所以指数从0枚举到z+1)。
而σk(i)=(p0)k+(p1)k+(p2)k+(p3)k+⋯+(pz)k
那么就可以得到σk(m)=σk(i)+(pz+1)k=σk(i)+mk。
- mni=p
- mmi!=i
i质因数分解后除了p之外还有其它质因子。
m=i×p=p1a1p2a2p3a3p4a4…ptat。
移一下项:
i=p1a1−1p2a2p3a3p4a4…ptat
所以mmi=p1a1−1,得到了p1a1=mmi×p。
而后面那半部分p2a2p3a3p4a4…ptat=mmii
然后就像最开始那种情况一样了:
σk(m)=σk(mmi×p)⋅σk(mmii)。