589 字
3 分钟
阶乘因数问题

1. 阶乘的因数个数#

考虑一个正整数nn的阶乘n!n!,求它有多少个质因数pp,即求最大ii,使n!=kpin!=kp^i

显然,所有pp的倍数都含有至少一个因数pp,从11nnnn个数中有np\lfloor\dfrac{n}{p}\rfloor个数是pp的倍数

同样的,所有p2p^2的倍数都含有至少两个因数pp,从11nnnn个数中有np2\lfloor\dfrac{n}{p^2}\rfloor个数是p2p^2的倍数

以此类推,所有pjp^j的倍数都含有至少ii个因数pp,从11nnnn个数中有npj\lfloor\dfrac{n}{p^j}\rfloor个数是pip^i的倍数

当然,p2p^2的倍数也是pp的倍数,pjp^j的倍数也是pj1p^{j-1}的倍数,所以我们可以认为,每个p2p^2的倍数都在pp倍数的基础上多一个因子pp,每个pjp^{j}的倍数都在pj1p^{j-1}倍数的基础上多一个因子pp,那么我们就得出了最后的式子

i=np+np2+np3+i= \lfloor\dfrac{n}{p}\rfloor+\lfloor\dfrac{n}{p^2}\rfloor+\lfloor\dfrac{n}{p^3}\rfloor+\cdots

2. 二进制与组合数奇偶#

对于一个组合数Cnm=n!m!(nm)!C^m_n=\dfrac{n!}{m!(n-m)!},要讨论它的奇偶,也就是看它分子分母含因子22的情况

a,b,ca,b,c分别为n!,m!,(nm)!n!,m!,(n-m)!含因子22的数目

Cnmmod2={0,a>b+c1,ab+cC^m_n\mod{2}=\begin{cases}0,a>b+c\\1,a\le b+c\end{cases}

显然,a<b+ca<b+c时,CnmC^m_n中会产生22的负次幂,而CnmC^m_n是一个整数,所以aa不可能小于b+cb+c

所以有

Cnmmod2={0,ab+c1,a=b+cC^m_n\mod{2}=\begin{cases}0,a\ne b+c\\1,a= b+c\end{cases}

那么我们来分析a,b,ca,b,c

aa为例,a=n2+n22+n23+a=\lfloor\dfrac{n}{2}\rfloor+\lfloor\dfrac{n}{2^2}\rfloor+\lfloor\dfrac{n}{2^3}\rfloor+\cdots

n=a0×20+a1×21+a2×22++ai×2in=a_0\times 2^0+a_1\times 2^1+a_2\times 2^2+\cdots+a_i\times 2^i,有

a=a0×20+a1×21++ai×2i2+a0×20+a1×21++ai×2i22++a0×20+a1×21++ai×2i2i=a1×21+a2×22++ai×2i2+a2×22+a3×23++ai×2i22++ai×2i2i=(a1+a2×21++ai×2i1)+(a2+a3×21++ai×2i2)++ai=a1+a2(20+21)+a3(20+21+22)++ai(20+21++2i1)=a0(201)+a1(211)+a2(221)++ai(2i1)=j=0iaj(2j1)=j=0iaj2jj=0iaj=nj=0iaja=\lfloor\dfrac{a_0\times 2^0+a_1\times 2^1+\cdots+a_i\times 2^i}{2}\rfloor+\lfloor\dfrac{a_0\times 2^0+a_1\times 2^1+\cdots+a_i\times 2^i}{2^2}\rfloor+\cdots+\lfloor\dfrac{a_0\times 2^0+a_1\times 2^1+\cdots+a_i\times 2^i}{2^i}\rfloor\\=\dfrac{a_1\times 2^1+a_2\times 2^2+\cdots+a_i\times 2^i}{2}+\dfrac{a_2\times 2^2+a_3\times 2^3+\cdots+a_i\times 2^i}{2^2}+\cdots+\dfrac{a_i\times 2^i}{2^i}\\=(a_1+a_2\times 2^1+\cdots+a_i\times 2^{i-1})+(a_2+a_3\times 2^1+\cdots+a_i\times 2^{i-2})+\cdots+a_i\\=a_1+a_2(2^0+2^1)+a_3(2^0+2^1+2^2)+\cdots+a_i(2^0+2^1+\cdots+2^{i-1})\\=a_0(2^0-1)+a_1(2^1-1)+a_2(2^2-1)+\cdots+a_i(2^i-1)\\=\sum^{i}_{j=0}{a_j(2^j-1)}=\sum^{i}_{j=0}{a_j2^j}-\sum^{i}_{j=0}a_j=n-\sum^{i}_{j=0}a_j

不难发现,j=0iaj\sum^{i}_{j=0}a_j就是nn的二进制中11的数目

同理可得,b=mj=0ibj,c=nmj=0icjb=m-\sum^{i}_{j=0}b_j,c=n-m-\sum^{i}_{j=0}c_j

a=b+cnj=0iaj=mj=0ibj+nmj=0icjj=0iaj=j=0ibj+j=0icja=b+c\Longleftrightarrow n-\sum^{i}_{j=0}a_j = m-\sum^{i}_{j=0}b_j + n-m-\sum^{i}_{j=0}c_j\Longleftrightarrow \sum^{i}_{j=0}a_j = \sum^{i}_{j=0}b_j+\sum^{i}_{j=0}c_j

也就是说,nn二进制中11的数目等于mm二进制中11的数目和nmn-m二进制中11的数目之和

换句话说,mm二进制中有几个11nmn-mnn的二进制中就减少几个11

来到二进制减法中,对于mm中某个为11的位,如果nn中对应位为11,那么计算减法时nn就刚好减少一个11,而如果nn中对应位为00,则必然产生退位(nm)(n\ge m),必然增加nn11的个数,因此,对于mm中所有为11的位,只有nn中每个对应位都为11时,上述式子才会成立

用按位与(&)(\&)描述这一条件就是n&m=mn\&m=m

综上,我们得出结论Cnmmod2={0,n&mm1,n&m=mC^m_n\mod2=\begin{cases}0,n\&m\ne m\\1,n\&m=m\end{cases}

阶乘因数问题
https://ssl.ztsubaki.xyz/posts/12/12/
作者
ZTsubaki
发布于
2025-02-27
许可协议
CC BY-SA 4.0