二分答案的题,要注意最后检查一下答案合法性
题目分析
根据题目数据,考虑分解质因数和二分,又因为2的个数的增长速度
远高于5,所以我们考虑5的个数>=k即可,根据单调性,考虑二分答案
时间复杂度约 $O(logklogk)$,还要再小一些
#include <iostream>
#include <cstring>
#include <algorithm>
typedef long long LL;
using namespace std;
LL k, ans;
LL check(LL n) {
LL cnt = 0;
for(; n; n /= 5) cnt += n / 5;
return cnt;
}
int main() {
scanf("%lld", &k);
LL l = 0, r = 5 * k + 5;
while (l + 1 < r) {
LL mid = (l + r) / 2;
if(check(mid) >= k) {
ans = mid;
r = mid;
}else {
l = mid;
}
}
//记得最后再check一下答案
printf("%lld\n", check(ans) == k ? ans : - 1);
return 0;
}