题目:http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1138
这是个二分TAT……
分的是5的个数。因为末尾有0就是乘以10,10是由2*5得出来的。在N!里面2比5多得多,所以只用算5的个数就可以了。
5的个数的算法具体看代码吧,我觉得比较奇妙。
#include<stdio.h>
#include<string.h>
long long OK(long long x)
{
long long sum=0;
while(x)
{
sum+=x/5;
x/=5;
}
return sum;
}
int main()
{
int i,T,k=1;
long long n;
scanf("%d",&T);
while(T--)
{
scanf("%lld",&n);
int flag=0;
long long l=1,r=1000000000,mid;
while(l<=r)
{
mid=(l+r)/2;
if(OK(mid)>=n)
r=mid-1;
else
l=mid+1;
}
if(OK(l)==n)
printf("Case %d: %lld\n",k++,l);
else
printf("Case %d: impossible\n",k++);
}
return 0;
}