【分治】魔法石的诱惑

        今天上英语课没好好听讲,专业英语的老师很牛,原专业是机械,然后自学英语和计算机。现在和外国人交流无压力,而且计算机的专业课也都很懂。

我什么时候才能成为大佬呢?


                                                  烟大终于成为了“淹大


问题 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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值