约数问题
2023-08-09 20:33:50 # OI # Problem

约数个数

先看约数的个数:d(n)d(n)

n=p1a1p2a2ptat,mn,m=p1b1p2b2ptbtn=p_1^{a_1}p_2^{a_2}\dots{p_t^{a_t}},m|n,m=p_1^{b_1}p_2^{b_2}\dots{p_t^{b_t}}

mmnn的一个约数,每个质因子上方的指数取值为[0,a1][0,a_1],也就是有a1+1a_1+1种可能,每一个质因子的改变都会产生一个新的约数,所以乘起来就是d(n)=(a1+1)(a2+1)(a3+1)(at+1)d(n)=(a_1+1)\cdot(a_2+1)\cdot(a_3+1)\dots(a_t+1)

暴力求约数和

再来看简单的情况:求σ1(n)\sigma_1(n),即求mm每个约数的一次方的和。

for(int i=1;i<=n;i++)
	for(int j=i;j<=n;j+=i)//枚举i的倍数
		s[i]+=j;

枚举ii的倍数jj,因此iijj的因数,这样就可以 nlogn 的复杂度求出约数和,下面讲O(n)O(n)递推。

线性递推

σk(m)\sigma_k(m):

代表mm的每个约数的kk次方的和。

枚举的话我们可以设m=p1a1p2a2p3a3ptktm=p_1^{a_1}p_2^{a_2}p_3^{a_3}\dots{p_t^{k_t}}(指数大于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]\sigma_k(m)=[(p_1^0)^k+(p_1^1)^k+(p_1^2)^k+\dots+(p_1^{a_1})^k]\cdot[(p_2^0)^k+(p_2^1)^k+(p_2^2)^k+\dots+(p_2^{a_2})^k]\cdot[(p_3^0)^k+(p_3^1)^k+(p_3^2)^k+\dots+(p_3^{a_3})^k]\dots[(p_t^0)^k+(p_t^1)^k+(p_t^2)^k+\dots+(p_t^{a_t})^k]

也就是σk(m)\sigma_k(m)的定义式,求解这个式子的复杂度是调和级数,约为 nlogn。

这个式子的解释就是对于p1p_10a10\sim{a_1}中任选一个指数,对于p2p_20a20\sim{a_2}中任选一个指数,……,一直到ptp_t,这样乘起来,这个数一定是mm的约数。

我们对每一个pp枚举这个指数,实际上就是枚举了所有的mm的约数的kk次方并把它们求和,这就是这个多项式的意义(不能理解请手动展开)。

我们线性筛的时候,枚举了一个ii,使得m=i×pm=i\times{p},其中ppmm最小质因子

我们也把ii质因数分解一下:i=p1a1p2a2p3a3ptati=p_1^{a_1}p_2^{a_2}p_3^{a_3}\cdots{p_t^{a_{t}}}(注意此处的ii的各个质因子与mm不是同一套)。

然后设mmi=p1a1mm_i=p_1^{a_1},代表ii质因数分解后的所有最小质因子的乘积,mni=p1mn_i=p_1,代表ii质因数分解后的最小质因子。

开始分类讨论:

  1. mni!=pmn_i!=p

首先mnipmn_i\ge{p},这是因为ppmm的最小质因子,mnimn_i如果比它还小,那么ii的最小的质因子也就会被换为pp,总之pp是最小的,不可能有其它因子比它还小。

mni!=pmn_i!=p其实就是mni>pmn_i>p,而mnm=pmn_m=p,因此a1=1a_1=1,即这项的指数为11

那么σk(p)=[(p10)k+(p11)k+(p12)k++(p1a1)k]\sigma_k(p)=[(p_1^0)^k+(p_1^1)^k+(p_1^2)^k+\dots+(p_1^{a_1})^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]\sigma_k(i)=[(p_2^0)^k+(p_2^1)^k+(p_2^2)^k+\dots+(p_2^{a_2})^k]\cdot[(p_3^0)^k+(p_3^1)^k+(p_3^2)^k+\dots+(p_3^{a_3})^k]\dots[(p_t^0)^k+(p_t^1)^k+(p_t^2)^k+\dots+(p_t^{a_t})^k],为后半部分,两者相乘,即σk(m)=σk(p)σk(i)\sigma_k(m)=\sigma_k(p)\cdot{\sigma_k(i)}

  1. mni=pmn_i=p
    1. mmi=imm_i=i

ii质因数分解后所有的质因子都是一样的,都是mnimn_i,也就是mmi=(mni)a1mm_i=(mn_i)^{a_1},设mmi=pz=imm_i=p^z=i,即a1=za_1=z

mni=pmn_i=p,因此m=i×p=pz+1m=i\times{p}=p^{z+1},也就是说mm的质因子现在只有pp

那么根据σm(k)\sigma_m(k)的定义式,σk(m)=(p0)k+(p1)k+(p2)k+(p3)k++(pz+1)k\sigma_k(m)=(p^0)^k+(p^1)^k+(p^2)^k+(p^3)^k+\cdots+(p^{z+1})^k(因为此时a1=z+1a_1=z+1,所以指数从00枚举到z+1z+1)。

σk(i)=(p0)k+(p1)k+(p2)k+(p3)k++(pz)k\sigma_k(i)=(p^0)^k+(p^1)^k+(p^2)^k+(p^3)^k+\cdots+(p^{z})^k

那么就可以得到σk(m)=σk(i)+(pz+1)k=σk(i)+mk\sigma_k(m)=\sigma_k(i)+(p^{z+1})^k=\sigma_k(i)+m^k

  1. mni=pmn_i=p
    1. mmi!=imm_i!=i

ii质因数分解后除了pp之外还有其它质因子。

m=i×p=p1a1p2a2p3a3p4a4ptatm=i\times{p}=p_1^{a_1}p_2^{a_2}p_3^{a_3}p_4^{a_4}\dots{p_t^{a_t}}

移一下项:

i=p1a11p2a2p3a3p4a4ptati=p_1^{a_1-1}p_2^{a_2}p_3{a_3}p_4{a_4}\dots{p_t^{a_t}}

所以mmi=p1a11mm_i=p_1^{a_1-1},得到了p1a1=mmi×pp_1^{a_1}=mm_i\times{p}

而后面那半部分p2a2p3a3p4a4ptat=immip_2^{a_2}p_3{a_3}p_4{a_4}\dots{p_t^{a_t}}=\dfrac{i}{mm_i}

然后就像最开始那种情况一样了:

σk(m)=σk(mmi×p)σk(immi)\sigma_k(m)=\sigma_k(mm_i\times{p})\cdot{\sigma_k(\frac{i}{mm_i})}