魔法石的诱惑

魔法石的诱惑

题目描述

修 罗王远远地看见邪狼狂奔而来,问道:“慌慌张张地跑什么?” 邪狼大口大口地喘气:“我路过一家魔法石店,看到摆着那么多高阶魔法石,我就跑进去抢了一大袋。” 修罗王怒道:“光天化日,朗朗乾坤,众目睽睽之下,你也敢抢?” 邪狼:“我抢魔法石的时候,压根儿就没看见人,眼里只看见魔法石了。” 修罗王:“……” 其实邪狼的贪婪很容易理解,因为高阶魔法石有一个特征,即它的重量进行阶乘运算后末尾有几个0,就拥有同等重量普通魔法石几倍的魔法力。例如 5!=5×4×3×2×1=120,而120结尾包含1个零,这意味着该魔法石拥有同等重量的普通的魔法石1倍的魔法力。你的任务是找到最小自然数N,使 N!在十进制下包含Q个零。

输入

一个数Q(0≤Q≤108

输出

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

样例输入

2

样例输出

10
当0 < n < 5时,f(n!) = 0;
  当n >= 5时,f(n!) = k + f(k!), 其中 k = n / 5(取整)。
 
  n!后多少个零。数学问题。有多少个与5有关。
知道这一点后,不难找出有q个零的n!。  范围从5-2<<31-1 用二分法也不过找30次。
 
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int jc(int n){  //求n!后的0的个数
    int sum=0;
    while(n){
        sum+=n/5;
        n/=5;
    }
    return sum;
}
int erfen(int n,int low ,int hight){
    int mid,c ;
    while(low<=hight){
        mid =(low+hight)/2;
        c=jc(mid);
        if(c==n)    return mid;
        else
            if(c>n) hight = mid-1;
        else low=mid+1;
    }
    return -1;
}
int main(){
    int n,ans;
    scanf("%d",&n);
    if(n==0)    printf("1
");
    else{
        ans=erfen(n,5,200000000);
        if(ans==-1) printf("No solution
");
        else{
            ans=ans-ans%5;
            printf("%d
",ans);
        }
    }
}

原文地址:https://www.cnblogs.com/acmtime/p/5715846.html