求阶乘后缀0个数【二分】+【数学】

题目链接:http://www.bjfuacm.com/problem/374/

                                             星球引力

发布时间: 2018年4月18日 17:36   最后更新: 2018年4月18日 17:39   时间限制: 1000ms   内存限制: 128M

描述

某天,小A获得在太空某星球旅游的机会。这个星球很奇怪,它的引力根据每个人的重量计算的。例如,当小A的体重为5时,则星球对小A的引力为5!后包含0的个数,即5!=5×4×3×2×1=120,那么星球对小A的引力为1。现在,小A想考考你,是否有这样一个人,当其体重为数n时(n为自然数),使得其受到的引力为m,如果存在多个数n,则输出最小的一个。

输入

输入包含多组。输入一个数m(0<=m<=10^8)

输出

每个输出占一行,如果存在,则输出最小的n,如果不存在,则输出"No solution"。

样例输入1

2

样例输出1

10

解题思路:

这题需要一点数学知识,例如5!后包含0的个数,2*5是包含一个0的,那么2,4也包含2,所以2的个数是够的,所以
我们只需要知道5的个数就行了
比如100!后面包含多少个0呢?
每隔5,会有一个0,例如:5,10,15,20...                                               //因为每隔5,2的个数是够的,至少有一个数能够提出一个2,与5想乘形成一个后缀0,下面的类似
每隔25,会多出一个0,因为25=5*5,例如:25,50,75...
每个125,也会多出一个0...
依次类推,可以发现,100!后包含的0的个数就是100/5+100/25=24个
如果这里能理解,就很容易懂了。考虑1e9!后面0的个数是大于10^8,所以,我们只需要在5~1e9之间二分就可以了
当然,还可以缩小范围来优化解法。

 
#include<cstdio>
int cal(int num)
{
    int sum = 0;
    while (num)
    {
        sum += num / 5;
        num /= 5;
    }
    return sum;
}
int find(int l, int r, int m)
{
    int mid;
    while (l<r)
    {
        mid = l + r >> 1;
        int pnum = cal(mid);
        if (pnum<m)
            l = mid + 1;
        else
            r = mid;
    }
    if (cal(l) != m)
        return -1;
    return l;
}
int main()
{
    int m;
    while (scanf("%d", &m) != EOF)
    {
        if (m == 0)
        {
            printf("1\n");
            continue;
        }
        int cnt = find(5, 1000000000, m);
        cnt == -1 ? printf("No solution\n") : printf("%d\n", cnt);
    }
    return 0;
}

2018-04-19

原文地址:https://www.cnblogs.com/00isok/p/8878727.html

时间: 2024-08-01 20:05:53

求阶乘后缀0个数【二分】+【数学】的相关文章

UVA 10061 How many zero&#39;s and how many digits ? (m进制,阶乘位数,阶乘后缀0)

题意:给出两个数字a和b,求a的阶乘转换成b进制后,输出(1)后缀中有多少个连续的0? (2)有多少位? 思路:逐个问题解决. 设a!=k.  k暂时不用直接转成b进制. (1)阶乘后缀0问题.先看这个十进制后缀0的例子:http://www.cnblogs.com/xcw0754/p/4604473.html 解法差不多,稍变化. 首先将b分解成若干质数(比如8={2*2*2})保存在一个集合A中(注意自然数的质数分解是唯一的),只要有一个序列A就能构成一个0,因为满b就进位,b可以表示成10

51Nod 1003 阶乘后面0的数量(数学,思维题)

1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0. Input 一个数N(1 <= N <= 10^9) Output 输出0的数量 Input示例 5 Output示例 1题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1003编程之美有讲:一个数 n

HDU 1124 Factorial (阶乘后缀0)

题意: 给一个数n,返回其阶乘结果后缀有几个0. 思路: 首先将十进制质因数分解得2*5=10.将n!质因数分解,那么分解后,其中应含有min(2个数,5个数)个后缀0. 为何这么说?例如n=15,那么{1 2 3 4 5 6 7 8 9  10 11 12 13 14 15},那么可以产生2的数字有{2,4,6,8,10,12,14},可以产生5的只有{5,10,15},质数中只有2乘以5才能形成10,因为素数只有2是偶数!!!那么min(2个数,5个数)就决定了可以产生10的个数,也就决定了

Factorial Trailing Zeroes(析因,求尾随个0个数)

Given an integer n, return the number of trailing zeroes in n! 这是LeetCode Online Judge上的一个原题:给定一个n,求n!中,末尾0的个数. 思路 n!中0的个数,可以将n!表示成 n!=m*10k,其中k就是题目要求的结果.那么,10k是怎么来的呢?很容易想到,10=2*5,那么,10k=(2*5)k:至此,可以简化成,题目求的是2*5的个数: 进一步思考,1*2*3……(n-1)*n,求2*5的个数就是求1-n

(二分搜索 数论)(求阶乘里零个数对应的阶乘)light oj -- 1138

链接 Description 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 inte

[LeetCode] Factorial Trailing Zeroes 求阶乘末尾零的个数

Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in logarithmic time complexity. Credits:Special thanks to @ts for adding this problem and creating all test cases. 这道题并没有什么难度,是让求一个数的阶乘末尾0的个数,也就是要找乘数中10的个数,

light_oj 1138 求阶乘后导零的个数

light_oj 1138  求阶乘后导零的个数 N - Trailing Zeroes (III) Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit Status Practice LightOJ 1138 Description You task is to find minimal natural number N, so that N! contains exactly Q 

正数阶乘结尾0的个数

题目:对任意输入的正整数N,编写C程序求N!的尾部连续0的个数,并指出计算复杂度.如:18!=6402373705728000,尾部连续0的个数是3. (不用考虑数值超出计算机整数界限的问题). 刚看到这道题,脑子中一闪而过的肯定是最原始的方法,但是仔细看看题目,不考虑超出计算机整数边界的问题.显然如果数据过大,求阶乘本身就是个复杂的计算,然后再找结果尾数为0的个数. 1.这个问题当然有简便的方法,我们这样思考,结尾0的个数,就是乘积是10的倍数,因子中有多少个10 就有多少个零,10再次分解就

阶乘末尾0的个数(证明)

先给出算法: 给定n,求n的阶乘末尾0的个数. int res = 0; while (n > 0) { res += n / 5; n /= 5; } 因为: 比方说求15的阶乘,也就是求 1 × 2 × 3 × 4 × 5 × 6 × 7 × 8 × 9 × 10 × 11 × 12 × 13 × 14 × 15 的末尾0的个数.现在我们把这15个数分解出来含有5的因子 1 × 2 × 3 × 4 × 5 × 6 × 7 × 8 × 9 × 2   × 11 × 12 × 13 × 14 ×