关于 n!的p进制下有多少个后导零 的问题

给定数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;
}

代码如上,欢迎讨论。

猜你喜欢

转载自blog.csdn.net/CAOSHUCAOSHU/article/details/110749271
今日推荐