UVA10061-How many zero's and how many digits

chunlvxiong的博客


题目描述:

  求出n!在b进制下末尾有几个零,有几位。

思考&分析:

  1、末尾0数:
  先将B质因数分解,然后对于1 to n,分别找出有几个这样的质因数,然后min一下就好了。
  2、位数:
  Σlog(i)/log(B)向上取整(如果是整数就+1)|1<=i<=n

贴代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=800;
int n,B,P,prime[805],cnt;
bool flag[805];
struct node{
    int val,cnt;
}zys[805];
void get_P(){
    memset(flag,1,sizeof(flag));
    P=0;
    for (int i=2;i<=maxn;i++)
    if (flag[i]){
        prime[++P]=i;
        for (int j=i*i;j<=maxn;j+=i)
            flag[j]=0;
    }
}
void fenjie(int x){
    cnt=0;
    for (int i=1;i<=P;i++)
    if (x%prime[i]==0){
        zys[++cnt].val=prime[i];
        zys[cnt].cnt=0;
        while (x%prime[i]==0)
            x/=prime[i],zys[cnt].cnt++;
        if (x==1) break;
    }
}
int calc(int x,int y){
//计算x!中包含y的几次方
    int res=0;
    while (x){
        res+=x/y;
        x/=y;
    }
    return res;
} 
int main(){
    get_P();
    while (~scanf("%d%d",&n,&B)){
        fenjie(B);
        int ans=1e8;
        for (int i=1;i<=cnt;i++)
            ans=min(ans,calc(n,zys[i].val)/zys[i].cnt);
        printf("%d ",ans);
        double res=0;
        for (int i=1;i<=n;i++)
            res+=log(i);
        res=floor(res/log(B)+1e-8)+1;
        printf("%d\n",(int)res); 
    }
    return 0;
}

 

posted @ 2017-09-17 21:45  chunlvxiong  阅读(207)  评论(0编辑  收藏  举报