共5題,其中某一題如下
題目:設設 n! 末尾0個個數為Q,現給出Q,求滿足條件的最小正整數n($1 \leq Q \leq 10^{18}$)
分析:
給出n求 n! 末尾0的個數,有規律:
ll func(ll n) { ll res = 0; while(n >= 5) { n /= 5; res += n; } return res; }
而且,Q關於n是單調的,即n越大,Q越大或不變,所以可以用二分。
注意,可能n不存在,例如Q=11。因為遇到50,500這種一次增加了多個0。
#include<iostream> #include<cstdio> using namespace std; typedef long long ll; ll x; ll func(ll n) { ll res = 0; while (n >= 5) { n /= 5; res += n; } return res; } void solve() { ll l = 1, r = 1e18, mid; while (l < r) { mid = (l + r) >> 1; ll tmp = func(mid); if (tmp < x) l = mid + 1; else if (tmp >= x) r = mid; } if (func(r) != x) cout << "No solution" << endl; // check一次 else cout << r << endl; } int main() { int T; cin >> T; while (T--) { cin >> x; solve(); } return 0; }