题目地址:http://lightoj.com/volume_showproblem.php?problem=1138
给出q,当n为何值时,n!末尾有q个零。
我们知道零是由10决定的,10可以分解为素数2和5,而2的数量大于5,根据木桶定理,零的个数就是1-n中5的个数。5含有1个5,10含有一个5,25含有两个5,那么n可能是大于等于5,小于等于5*q,以此为界限进行二分即可。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
long long solve(int m)
{
long long ans=0;
while(m>0)
{
ans+=m;
m=m/5;
}
return ans;
}
int main()
{
int t,n,ans1;
scanf("%d",&t);
ans1=1;
while(t--)
{
scanf("%d",&n);
int l,r,mid,flag;
flag=0;
l=1;r=n;
while(l<=r)
{
mid=(l+r)/2;
long long ans=solve(mid);
if(ans==n)
{
flag=1;
break;
}
if(ans<n)
{
l=mid+1;
}
else
{
r=mid-1;
}
}
if(flag)
{
printf("Case %d: %d\n",ans1,5*mid);
}
else
printf("Case %d: impossible\n",ans1);
ans1++;
}
return 0;
}