提出问题:求阶乘的标准分解式中素因数的指数?
先说结论,定理如下:
简单证明
设 pow(p,k-1)<= n < pow(p,k)
有:
m = p*t[1]+r[1] (0<=r[1]<p) (除法的基本原理,t[1] r[1] 中的[1]代表下标,下同)
t[1] = p*t[2]+r[2] (0<=r[1]<p)
……
t[k-2] = p*t[k-1]+r[k-1] (0<=r[k-1]<p)
t[k-1] = p*t[k]+r[k] (0<=r[k]<p)
于是,在整数1到n之间,能被p整除的数有t[1]个,能被p平方整除的数有t[2]个,……能被p的k-1次方整除的数有t[k-1]个,
能被p的k次方整除的数为0个(由n的大小假设得知)
因此,在n!的标准分解中,素数p的指数,即p出现的次数为t[1]+t[2]+……+t[k-2]+t[k-1]+0(n除以p k遍之后没有商了,就结束求出结果来了!)
(在数学竞赛中是标准的素因数分解求法,而在OI中则要考虑时间复杂度和溢出问题,采用 除+取余的操作进行)
代码展示
int get_pow(int n,int p)
{ //求n!的标准分解式中,素因数p的指数(作为因数出现的次数)
int num = 0;
while(n)
{
num+=n/p;
n/=p;
}
return num;
}
例题1: 给定一个正整数 p,求一个最小的正整数 n,使得 n! 是 p 的倍数(p<=10^9)
题解: 如果p不是素数,则将p进行质因数分解,求每一个因数的指数,然后二分查找n,看n!中是否包含这些所有的因数,且各自的指数大于等于在p中出现的指数,参见另一篇博客:https://blog.csdn.net/lgw999jyx/article/details/105037252
例题2: 求(1325)! 的末尾有多少个0?
参考文献
[1]王维余.阶乘的标准分解式中素因数的指数[J].赣南师范学院学报,1994(06):62-64.
[2]张光俊.质数p在正整数n中的最高指数[J].四川职业技术学院学报,2013,23(01):151-153.