题目链接:https://vjudge.net/contest/373416#problem/D
题意:给出末尾有多少个0,问这是多少的阶乘。
思路:末尾有多少个0,就相当于求阶乘中有多少个5。
注:因为给出的末尾0的数据大,所以在查找的过程中需要使用二分查找。
Sample Input
3
1
2
5
Sample Output
Case 1: 5
Case 2: 10
Case 3: impossible
代码如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll long long
ll judge(ll x)
{
ll res=0;
while (x)//求x中有多少个5
{
res+=x/5;
x/=5;
}
return res;
}
ll solve(ll num)//二分查找
{
ll L=1;
ll R=0x3f3f3f3f;
ll ans=-1;
while (L<=R)
{
ll mid=(L+R)/2;
ll s=judge(mid);
if (s==num)
{
ans=mid;
R=mid-1;
}
else if (s>num)
{
R=mid-1;
}
else if (s<num)
L=mid+1;
}
return ans;
}
int main()
{
int t;
int o=1;
scanf ("%d",&t);
while (t--)
{
ll num;
scanf ("%lld",&num);
printf ("Case %d: ",o++);
ll key=solve(num);
if (key==-1)
printf ("impossible\n");
else
printf ("%lld\n",key);
}
return 0;
}