题目分析
这道题刚开始拿到手中并没有什么好的想法,但是自己想一下会发现,n!我们会发现末尾含有0,说明相乘的时候必然可以拆分出2和5,同时是2的倍数明显比5的倍数多很多,那么我们找0的个数就等价于找5的个数,然后对于5的个数,我们通过二分是5的多少倍,同时我们需要求出是 51,52,53,.....,5m 的多少倍,累计即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
LL solve(LL x){
LL temp = 5;
LL ans = 0;
while(x/temp){
ans += x/temp;
temp *= 5;
}
return ans;
}
int main(){
int T, N;
scanf("%d", &T);
for(int kase = 1; kase <= T; kase++){
scanf("%d", &N);
LL l = 1, r = 1e8;
while(l < r){
LL mid = (l+r)/2;
if(solve(mid*5) >= N) r = mid;
else l = mid+1;
}
if(solve(r*5) != N) printf("Case %d: impossible\n", kase);
else printf("Case %d: %lld\n", kase, 5*r);
}
return 0;
}