题目:
错误思路:
刚开始尝试使用Java大数打一下表,得到了一个错误规律,让我在WA了两天之后看着题解还是不明白。
对比正确题解才知道在35之后我的规律错误了,给了我死刑,ok,换思路吧。。。
正确思路:
二分,判断中间值 mid 是否满足 mid 的阶乘后的零的个数满足条件,满足就寻找更小值,不满足扩大寻找。
难点在于如何判断一个数的阶乘后 0 的个数。思考过后明白,每个10都来自2和5,而某个数字的范围中2的个数一定多于5的个数。
也就是说我要找到1 ~ mid 中5倍数的个数。
#include <cstdio> #define ll long long using namespace std; ll l = 1,r = 1e18; ll k ; ll Zero(ll x) // 判断 5 的倍数的个数 { ll ans = 0,t = x; while(t){ ans += t / 5; t /= 5; } return ans; } int main() { scanf("%lld",&k); while(l < r - 1){ // 二分搜索 ll mid = l + (r-l) / 2; if(Zero(mid) >= k){ r = mid; }else{ l = mid; } } printf("%lld ",r); }