魔法石的诱惑
魔法石的诱惑
题目描述
修 罗王远远地看见邪狼狂奔而来,问道:“慌慌张张地跑什么?” 邪狼大口大口地喘气:“我路过一家魔法石店,看到摆着那么多高阶魔法石,我就跑进去抢了一大袋。” 修罗王怒道:“光天化日,朗朗乾坤,众目睽睽之下,你也敢抢?” 邪狼:“我抢魔法石的时候,压根儿就没看见人,眼里只看见魔法石了。” 修罗王:“……” 其实邪狼的贪婪很容易理解,因为高阶魔法石有一个特征,即它的重量进行阶乘运算后末尾有几个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\n"); else{ ans=erfen(n,5,200000000); if(ans==-1) printf("No solution\n"); else{ ans=ans-ans%5; printf("%d\n",ans); } } }