找出最小的自然数据N,使得N!刚好有Q个后缀零。N!=1*2*...*N. 例如5!=1*2*3*4*5=120, 120有1个后缀0。
输入
先输入一个整数T(1 \le T \le 10000)T(1≤T≤10000),表示有T组测试数据。
接下来T行,每行一个整数Q(1 \le Q \le 10^8)Q(1≤Q≤108)。
输出
对于每一个测试用例,输出case编号和整数N,如果找不到,输出impossible
样例
输入
复制
3 1 10 5
输出
复制
Case 1: 5 Case 2: 45 Case 3: impossible
提示
子任务1,10分,1 \le Q \le 21≤Q≤2
子任务2,30分,1 \le Q \le 101≤Q≤10
子任务3,60分,全范围
#include <iostream> #include <cstdio> #include <cstdlib> #include <queue> #include <cstring> #include <cmath> #include <set> #include <algorithm> #include <functional> #define inf 0x3f3f3f3f int GetNum(int n) { int num = 0; int d = 1; while (d <= n) { num += n / d; d *= 5; } return num; } int GetAllNum(int d) { int l = 0; int r = d; while (l <= r) { int mid = (l + r + 1) / 2; int num = GetNum(mid); if (num < d) l = mid + 1; else if (num > d) r = mid - 1; else return mid * 5; } return -1; } int main() { int n, d; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &d); int num = GetAllNum(d); printf("Case %d: ", i + 1); if (num == -1) { printf("impossible\n"); } else { printf("%d\n", num); } } return 0; }
如果觉得有帮助,点个推荐啦~