LightOj 1138 - Trailing Zeroes (III) 阶乘末尾0的个数 & 二分

Posted 西瓜不懂柠檬的酸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LightOj 1138 - Trailing Zeroes (III) 阶乘末尾0的个数 & 二分相关的知识,希望对你有一定的参考价值。

题目链接:http://lightoj.com/volume_showproblem.php?problem=1138

题意:给你一个数n,然后找个一个最小的数x,使得x!的末尾有n个0;如果没有输出impossible

可以用二分求结果,重点是求一个数的阶乘中末尾含有0的个数,一定和因子5和2的个数有关,因子为2的明显比5多,所以我们只需要求一个数的阶乘的因子中一共有多少个5即可;

LL Find(LL x)
{
    LL ans = 0;
    while(x)
    {
        ans += x/5;
        x /= 5;
    }
    return ans;
}

例如125! 125/5 = 25;所以125!中含5的项为25*5+24*5+23*5+...+3*5+2*5+1*5 = 25!*5 

所以125!末尾有25+5+1 = 31 个0;

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
typedef long long LL;
#define N 1000001
using namespace std;
const double eps = 1e-6;

LL Find(LL x)
{
    LL ans = 0;
    while(x)
    {
        ans += x/5;
        x /= 5;
    }
    return ans;
}

int main()
{
    int T, t = 1, n;
    scanf("%d", &T);
    while(T --)
    {
        scanf("%d", &n);
        LL ans = 0, L = 2, R = 1000000000;
        while(L <= R)
        {
            LL Mid = (L+R)/2;
            LL ret = Find(Mid);

            if(ret == n)
                ans = Mid;
            if(ret >= n)
                R = Mid - 1;
            else
                L = Mid + 1;
        }
        if(ans == 0)
            printf("Case %d: impossible\\n", t++);
        else
            printf("Case %d: %lld\\n", t++, ans);
    }
    return 0;
}
View Code

 

以上是关于LightOj 1138 - Trailing Zeroes (III) 阶乘末尾0的个数 & 二分的主要内容,如果未能解决你的问题,请参考以下文章

LightOj 1138 - Trailing Zeroes (III) 阶乘末尾0的个数 & 二分

Trailing Zeroes (I) LightOJ - 1028

LightOJ - 1282 - Leading and Trailing(数学技巧,快速幂取余)

LightOJ - 1282 Leading and Trailing

LightOJ 1282 Leading and Trailing (数学)

lightoj-1028 - Trailing Zeroes (I)(素数法求因子个数)