题目大意:求一个数N,N!的末尾连续0的个数为Q,求最小的N;
思路:判断有多少个0,可以判断分解之后有多少个2和5。如果是阶乘的话,遇到的5的数量一定比2少,所以判断遇到的5的数量即可。
判断N!分解之后有多少个5,可以通过除5,25,125,625,来判断。每次除法只需要+N/5,+N/25,25出现的次数已经在5中算过一次。
所以直接加就可以。
比如 50!就是12个0 50/5+50/25=12。剩下的就是二分那个数后面有Q个0。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int z[500]={0,5};
int num(int n){ //求这个数末尾有多少个0.
int ans=0;
for(int i=1;z[i]<=n;i++){
ans+=(n/z[i]);
}
return ans;
}
void bi(int q){ //二分求这个数
int left=1,right=5e8;
while(left<right){
int mid=(left+right)/2;
int cnt=num(mid);
if(cnt==q){
cout<<mid/5*5<<endl;
return ;
}
if(cnt<q){
left=mid+1;
}
else right=mid-1;
}
cout<<"impossible\n";
}
int main()
{
for(int i=2;i<15;i++){
z[i]=z[i-1]*5;
//cout<<z[i]<<endl;
}
int t;
cin>>t;
int q;
for(int i=1;i<=t;i++){
cin>>q;
cout<<"Case "<<i<<": ";
bi(q);
}
return 0;
}