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; }