UVA 10061How many zero's and how many digits ?

题意:
给你一个十进制数 n n ,然后问你在 b b 进制下 n ! n! 的尾数有多少个0,有多少位。
思路:
在十进制中求 N ! N! 中有多少0,做法是看1到N之中有多少个5,就有多少个零,因为 10 = 2 5 10=2\cdot 5 ,又因为2的数量多(偶数隔位出现)。
在本题中也是这个思路,不过,对 b b 进行质因数分解后,不能贸然选取最大的质因数,因为数量具有不确定性。就拿14 175来说, 175 = 5 2 7 175 = 5^2\cdot 7 ,14中有两个5两个7,两个5会产生一个0,如果用7来算答案就是2。
所以我们对 b b 进行质因数分解,并保存下来质因数出现的次数。然后逐个算取最小的即可。

有多少位呢,都知道10进制中逢十进一,一个数中有多少10,就是进了几位(还有个位)。
所以在 b b 进制中同样 d i g i t = l o g b n + 1 digit = \lfloor log_bn \rfloor +1

int prim[1000];
int tot[1000];
int main(){
    int n,m;
    while(cin >> n >> m){
        memset(tot,0,sizeof tot);
        int x = m;
        int inx = 0;
        for(int i = 2;i * i <= x;++i){
            if(!(x%i)){
                prim[++inx] =i;
                while(!(x%i)) x/= i,tot[inx] ++;
            }
        }
        if(x > 1) prim[++inx] = x,tot[inx] ++;

        int M = INF;
        for(int i = 1;i <= inx;++i){
            x = n;
            int cnt = 0;
            while(x){
                cnt += x/=prim[i];
            }
            M = min(M,cnt/tot[i]);
        }
        
        double res(0);
        for(int i = 1; i <= n;++i){
            res += log(i);
        }
        ll ans = floor(res/log(m)+eps) + 1;
        printf("%d %lld\n",M,ans);
        
    }
}
发布了589 篇原创文章 · 获赞 31 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_43408238/article/details/104383156