N!中素因子p的个数 【数论】

求N!中素因子p的个数,也就是N!中p的幂次

公式为:cnt=[n/p]+[n/p^2]+[n/p^3]+...+[n/p^k];

例如:N=12,p=2

12/2=6,表示1~12中有6个数是2的倍数,即2,4,6,8,10,12

12/2^2=6/2=3,表示1~12中有3个数是4的倍数,即4,8,12,它们能在提供2的基础上多提供一个2

12/2^3=3/2=1,表示1~12中有1个数是8的倍数,即12,它能在提供两个2的基础上又多提供一个2

代码为:

1 int cnt=0;
2 while(N){
3     cnt+=N/p;
4     N/=p;
5 }

刚开始一直不懂代码为什么这么写,其实就是当第一次算完n/p后,下一次需要算n/(p*p)=(n/p)/p,即上面写法。这是一个最好的写法,我本来想这么写:

1 //错误写法
2 int cnt=0;
3 while(N>=p){
4     cnt+=N/p;
5     p*=p;
6 }

显然,每次N除的是p的幂次,但是每次p*=p时,p是会变的,也就是每次除的并不是p的依次递增的幂次,可以改成这样:

1 int cnt=0;
2 int t=p;
3 while(N>=p){
4     cnt+=N/p;
5     p*=t;
6 }

 参考博客:https://www.cnblogs.com/dilthey/p/7588382.html

原文地址:https://www.cnblogs.com/zxhyxiao/p/8026280.html