魔法石的诱惑

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了魔法石的诱惑相关的知识,希望对你有一定的参考价值。

题目描述:

修罗王远远地看见邪狼狂奔而来,问道:“慌慌张张的跑什么?”
邪狼大口大口的喘气:“我路过一家魔法石店,看到摆着那么多高阶魔法石,我就跑进去抢了一大袋。”
修罗王怒道:“光天化日,朗朗乾坤,众目睽睽之下,你也敢抢?”
邪狼:“我抢魔法石的时候,压根就没看见人,眼里只看见魔法石了”
修罗王:“……”

其实邪狼的贪婪很容易理解,因为高阶魔法石有一个特征,即它的重量进行阶乘运算后末尾有几个0,就拥有同等重量的普通魔法石几倍的魔法力。例如5!=5*4*3*2*1=120,而120结尾包含1个零,这意味着该魔法石拥有同等重量的魔法石 1 倍的魔法力。你的任务是找到最小自然数 N ,使 N!在十进制下包含 Q 个零。

输入格式:

一个数Q(0 <= Q <= 10^8 )。

输出格式:

如果无解,输出“No solution”,否则输出 N 。

输入示例:

2

输出示例:

10

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>

using namespace std;

inline int read(){
    int x=0,f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if( ch == - ) f=-1;
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-0;
    return x*f;
}

const int maxx = 1000000000;

int n, ans;

int count(int num)
{
    int count = 0;
    for(; num >= 5; num /= 5) count += num / 5;
    return count;
}

int main(){
    n = read();
    int left=1,right=1000000000,ans=500000001;
    while(left <= right)
    {
        int mid=(right+left) / 2 , cnt = count(mid);
        if(cnt == n && mid < ans) ans = mid;
        if(cnt > n){
            right = mid - 1;
        }
        else if(cnt < n){
            left = mid + 1;
        }
        else if(cnt == n){
            right = mid - 1;
        }
    }
    if(ans == 500000001) puts("No solution");
    else printf("%d\n",ans);
}

 

以上是关于魔法石的诱惑的主要内容,如果未能解决你的问题,请参考以下文章

自我练习 - 分治算法

动态规划完全背包问题

优秀API设计的十大原则

js兵器谱之魔法召唤师:call / apply

移动自动化代码未运行并给出与诱惑相关的错误

单例模式的“诱惑”