后缀零

找出最小的自然数据N,使得N!刚好有Q个后缀零。N!=1*2*...*N. 例如5!=1*2*3*4*5=120, 120有1个后缀0。

输入

先输入一个整数T(1 \le T \le 10000)T(1T10000),表示有T组测试数据。

接下来T行,每行一个整数Q(1 \le Q \le 10^8)Q(1Q108)。

输出

对于每一个测试用例,输出case编号和整数N,如果找不到,输出impossible

样例

输入

复制
3
1
10
5

输出

复制
Case 1: 5
Case 2: 45
Case 3: impossible

提示

子任务1,10分,1 \le Q \le 21Q2

子任务2,30分,1 \le Q \le 101Q10

子任务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;
}
如果觉得有帮助,点个推荐啦~
原文地址:https://www.cnblogs.com/8023spz/p/15549999.html