zoukankan      html  css  js  c++  java
  • Light oj 1138

    1138 - Trailing Zeroes (III)
    Time Limit: 2 second(s) Memory Limit: 32 MB

    You task is to find minimal natural number N, so that N! contains exactly Q zeroes on the trail in decimal notation. As you know N! = 1*2*...*N. For example, 5! = 120, 120 contains one zero on the trail.

    Input

    Input starts with an integer T (≤ 10000), denoting the number of test cases.

    Each case contains an integer Q (1 ≤ Q ≤ 108) in a line.

    Output

    For each case, print the case number and N. If no solution is found then print 'impossible'.

    Sample Input

    Output for Sample Input

    3

    1

    2

    5

    Case 1: 5

    Case 2: 10

    Case 3: impossible


    PROBLEM SETTER: JANE ALAM JAN


    题意:给你一个数Q。代表N!中   末尾连续0的个数。让你求出最小的N。



    定理:求N!

    中  末尾连续0的个数


    求法例如以下
    LL sum(LL N)
    {
        LL ans = 0;
        while(N)
        {
            ans += N / 5;
            N /= 5;
        }
        return ans;
    }


    本来不敢写,最后发现即使Q = 10^8也不会超long long(貌似int都不超)


    又犯二了,区间开小了。

    WA了一次。




    AC代码:用二分实现的


    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <cstdlib>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <map>
    #include <string>
    #include <algorithm>
    #define LL long long
    #define MAXN 100+10
    #define MAXM 20000+10
    #define INF 0x3f3f3f3f
    using namespace std;
    LL sum(LL N)//求N阶乘中 末尾连续的0的个数
    {
        LL ans = 0;
        while(N)
        {
            ans += N / 5;
            N /= 5;
        }
        return ans;
    }
    int k = 1;
    int main()
    {
        int t;
        LL Q;
        scanf("%d", &t);
        while(t--)
        {
            scanf("%lld", &Q);
            LL left = 1, right = 1000000000000;//一開始开小了 醉了
            LL ans = 0;
            while(right >= left)
            {
                int mid = (left + right) >> 1;
                if(sum(mid) == Q)//相等时 要赋值给ans
                {
                    ans = mid;
                    right = mid - 1;
                }
                else if(sum(mid) > Q)
                    right = mid - 1;
                else
                    left = mid + 1;
            }
            printf("Case %d: ", k++);
            if(ans)
                printf("%lld
    ", ans);
            else
                printf("impossible
    ");
        }
        return 0;
    }
    






  • 相关阅读:
    Altera Coding Style 之多路选择器
    Altera Coding Style 之 时钟切换
    Altera Coding Style 之状态机
    Altera Coding Style 之 Latch
    Altera Coding Style 之 加法器
    JS代码小集合
    汉字转换字符C#(c shap) 代码
    php动态调用方法
    JavaScript 拖放效果
    C# 取得域名及目录地址
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7001855.html
Copyright © 2011-2022 走看看