Hàm f(x) = số chữ số 0 cuối của x!. Cho K, tìm số nguyên không âm x thỏa f(x) = K.
Ví dụ
K = 2 → kết quả 5 (các x: 10,11,12,13,14).
Thuật toán
- Hàm
ok(x)đếm số 0 cuối củax!bằng công thức Legendre:x/5 + x/25 + x/125 + ... - Nhận thấy
f(x)là hàm không giảm, mỗi giá trị K xuất hiện 0 hoặc 5 lần. - Dùng tìm kiếm nhị phân tìm
xnhỏ nhất sao chof(x) ≥ K. - Nếu
f(x) == Ktrả về 5, ngược lại 0.
Chương trình C++
#include <bits/stdc++.h>
using namespace std;
using lli = long long;
class Solution {
lli ok(lli x) {
lli ret = 0;
for(lli i=5; i<=x; i*=5) ret += x/i;
return ret;
}
public:
int preimageSizeFZF(int K) {
if(K == 0) return 5;
lli low = 1, high = (lli)K * 5;
while(low < high) {
lli mid = low + (high - low)/2;
if(ok(mid) < K) low = mid + 1;
else high = mid;
}
return ok(low) == K ? 5 : 0;
}
};
int main() {
Solution ob;
cout << ob.preimageSizeFZF(2); // 5
return 0;
}