zoukankan      html  css  js  c++  java
  • LightOJ Trailing Zeroes (III) 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


    题意:给你一个数字,这个数字代表N!后面有几个0。给出这个数字,计算N的值。


    解题思路:

    不论什么质因数都能够写成素数相乘的形式。所以计算一个数的阶乘后面几个0。仅仅需计算这个数包括多少5就可以。(关于这点不清楚的点:点击打开链接)。

    能够用二分法,找出这个点。

    想到用二分这道题也就没什么难度了。

    AC代码;

    <span style="font-size:18px;">#include <stdio.h>
    #include <math.h>
    #include <vector>
    #include <queue>
    #include <string>
    #include <string.h>
    #include <stdlib.h>
    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    typedef long long LL;
    
    LL solve(LL n)
    {
        LL num=0;
        while(n){
            num+=n/5;
            n/=5;
        }
        return num;
    }
    
    LL er(LL n)
    {
        LL x=1;
        LL y=1844674407370;
        LL mid;
        LL res=-1;
        while(y>=x){
            mid=(x+y)/2;
            LL ans=solve(mid);
            if(ans==n){
                res=mid;
                y=mid-1;
                //return mid;
            }
            else if(ans>n){
                y=mid-1;
            }
            else if(ans<n){
                x=mid+1;
            }
        }
        return res;
    }
    int main()
    {
    
        int t;
        scanf("%d",&t);
        int xp=1;
        while(t--){
            LL n;
            scanf("%lld",&n);
            LL ans=er(n);
            if(ans==-1)  printf("Case %d: impossible
    ",xp++);
            else printf("Case %d: %d
    ",xp++,ans);
        }
        return 0;
    }
    </span>


  • 相关阅读:
    xxx
    部署在自己的加了分享,试下
    疑问
    去掉分享
    womenzijide_jiafenxiang
    womenzijide2
    womenzijide
    xiugai-去除js注释
    xiugai2
    《设计模式之禅》读书笔记(一)——单例模式
  • 原文地址:https://www.cnblogs.com/yfceshi/p/6964400.html
Copyright © 2011-2022 走看看