#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
/*
二分+阶乘分解
是否存在一个数的阶层末尾0的个数为Q
*/
typedef long long ll;
const ll INF=1e18+5;
//求n!末尾0的个数
//能够组成0,2*5,2的个数比较多,只需判断5的个数
ll fun(ll n)
{
ll cnt=0;
while(n)
{
cnt+=n/5;
n/=5;
}
return cnt;
}
//二分枚举是否存在阶层末尾n个0的数
ll solve(ll n)
{
ll left=1;
ll right=INF;//有区间设定足够大
ll mid;
ll ans=-1;
while(left<=right)
{
mid=(left+right)>>1;
ll t=fun(mid);
if(t==n)
{
ans=mid;
right=mid-1;//改变区间的值,正常结束二分
}
else if(t>n)
{
right=mid-1;
}
else
{
left=mid+1;
}
}
return ans;
}
int main()
{
int T;
ll q;
scanf("%d",&T);
int kase=0;
while(T--)
{
scanf("%lld",&q);
ll ans=solve(q);
if(ans==-1)
{
printf("Case %d: impossible\n",++kase);
}
else
{
printf("Case %d: %lld\n",++kase,ans);
}
}
return 0;
}
LightOJ - 1138 Trailing Zeroes (III) (二分+阶乘分解)
最新推荐文章于 2020-10-23 09:16:04 发布