You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in decimal notation. As you know N! = 1*2*…*N. For example, 5! = 120, 120 contains one zero on the trail.
Input
Input starts with an integer T (≤ 10000), denoting the number of test cases.
Each case contains an integer Q (1 ≤ Q ≤ 108) in a line.
Output
For each case, print the case number and N. If no solution is found then print ‘impossible’.
Sample Input
3
1
2
5
Sample Output
Case 1: 5
Case 2: 10
Case 3: impossible
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define rep(i,s,e) for(int i=s;i<=e;i++)
#define rev(i,s,e) for(int i=e;i>=s;i--)
#define all(x) x.begin(),x.end()
#define sz(x) x.size()
#define szz(x) int(x.size()-1)
const int INF = 0x3f3f3f3f;
const int MOD = 1e9+7;
const int MAXN = 2e5+10;
typedef long long LL;
typedef pair<LL,LL> PII;
LL judge(LL n)
{
LL res = 0;
while(n)
{
res+=n/5;
n/=5;
}
return res;
}
LL bs(LL key)
{
LL l = 0;
LL r = 1LL<<60;
LL res = -1;
while(r-l>1)
{
LL mid = (l+r)/2;
LL ans = judge(mid);
if(ans>key) r = mid;
else if(ans == key)
{
r = mid;
res = mid;
}
else l = mid;
}
return res;
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
ios_base::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int t;
cin>>t;
int q;
int id = 1;
while(t--)
{
cin>>q;
LL ans = bs(q);
if(ans == -1) cout<<"Case "<<id++<<": "<<"impossible"<<endl;
else cout<<"Case "<<id++<<": "<<ans<<endl;
}
return 0;
}