C. wzy的大冒险——数学王国
单点时限: 2.0 sec
内存限制: 512 MB
wzy这一次来到了数学王国,加号国王为了考验他,找来了一个数字n,告诉了wzy这个数字的阶乘的末尾零的个数Q,猜错的话就要把wzy赶出去。现在请你帮帮wzy求这个数最小为多少。
若不存在输出"impossible"(输出不带引号)。
输入格式
输入数据包含T组(1≤T≤10000)
每一组数据包含一个数字Q (0≤Q≤108)
输出格式
对于每一组数据请输出这个数字n,否则输出"impossible"(输出不带引号)。
样例
input
3
1
2
5
output
5
10
impossible
input
1
10000000
output
40000010
解题思路:
本题用到两个知识,一个是阶乘末尾零的求法,另一个是二分;
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=1e5+10;
typedef long long ll;
int check(int x)
{
int ans=0;
while(x)
{
ans+=x/5;
x/=5;
}
return ans;//这一块是求阶乘的末尾零
}
int main()
{
int n;
cin>>n;
while(n--)
{
int x;
cin>>x;
ll ans=inf,l=0;
ll mid;
bool flag=0;
while(l<=ans)
{
mid=(ans+l)>>1;
if(check(mid)==x)
{
flag=1;
break;
}
else if(check(mid)>x)
{
ans=mid-1;
}
else
{
l=mid+1;
}//这是二分
}
if(!flag) cout<<"impossible"<<endl;
else
{
while(check(mid)==x)
{
mid--;
}
cout<<mid+1<<endl;
}
}
return 0;
}