给定数n,求n!的p进制下有多少个后导零。为了简化问题,p保证为素数。
如果用大整数写法,解法可能会超时。
易知,如果一个数可以另外一个数被整除,那么成为这个数的几倍数的数也可以被整除。
利用这个思路,可以推出“如果可以被p整除,那么这个数的几倍数的数也可以被整除”,即“如果可以使p进制下形成一个后导0,那么这个数的几倍数的数也可以如此,而且可能不止一个(与倍数成比例)”
代码如下:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int main()
{
int t,n,p,sum=0;
cin>>t;
for(int i=0;i<t;i++){
sum=0;
cin>>n>>p;
for(int k=p;k<=n;k+=p){
//与p成倍数的数肯定会被p整除,所有可以加上p的倍数。枚举n中数。
if(k%p==0){
int te=k;
while(te%p==0){
//如果可以被整除,就除尽,得到倍数,从而得到所有的后导0。
te/=p;
sum++;
}
}
}
cout<<sum<<endl;
}
return 0;
}
代码如上,欢迎讨论。