今天上英语课没好好听讲,专业英语的老师很牛,原专业是机械,然后自学英语和计算机。现在和外国人交流无压力,而且计算机的专业课也都很懂。
我什么时候才能成为大佬呢?
烟大终于成为了“淹大”
问题 C: 【分治】魔法石的诱惑
时间限制: 1 Sec 内存限制: 128 MB
提交: 212 解决: 93
[提交] [状态] [命题人:admin]题目描述
修罗王远远地看见邪狼狂奔而来,问道:“慌慌张张地跑什么?” 邪狼大口大口地喘气:“我路过一家魔法石店,看到摆着那么多高阶魔法石,我就跑进去抢了一大袋。” 修罗王怒道:“光天化日,朗朗乾坤,众目睽睽之下,你也敢抢?” 邪狼:“我抢魔法石的时候,压根儿就没看见人,眼里只看见魔法石了。” 修罗王:“……” 其实邪狼的贪婪很容易理解,因为高阶魔法石有一个特征,即它的重量进行阶乘运算后末尾有几个0,就拥有同等重量普通魔法石几倍的魔法力。例如5!=5×4×3×2×1=120,而120结尾包含1个零,这意味着该魔法石拥有同等重量的普通的魔法石1倍的魔法力。你的任务是找到最小自然数N,使N!在十进制下包含Q个零。
输入
一个数Q(0≤Q≤108)
输出
如果无解,输出“No solution”,否则输出N。
样例输入
复制样例数据2样例输出
10
废话不多说,我们来分析。
但是,上面连接里的代码,maxn开的不够大。因为呢,当Q=1e8的时候,n大约等于8*1e7。
所以,将maxn改为 8*1e7。
然后呢,我之前做这个题的疑问:
为什么只找5的个数就行了呢? 因为,因子里只要有2*5就行了,但是,2的话是每隔一个数就出现一次它的倍数,5的话是每隔四个数出现一个它的倍数。所以,5的倍数(或者说阶乘式子里,因子5肯定比因子2的个数少)。所以就取最少的了。
#include<bits/stdc++.h>
using namespace std;
const int maxn=8*1e7;
int findzero(int num)
{
int cnt=0;
while(num)
{
cnt+=num/5;
num/=5;
}
return cnt;
}
int main()
{
int q;
cin>>q;
int left=1,right=maxn;
while(left<=right)
{
int mid=(left+right)>>1;
int ans=findzero(mid);
if(ans==q)
{
mid-=mid%5;
cout<<mid;
return 0;
}
else if(ans<q)
{
left=mid+1;
}
else right=mid-1;
}
cout<<"No solution\n";
return 0;
}