共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; }