洛谷上的P1045 [NOIP2003 普及组] 麦森数

洛谷上的P1045 [NOIP2003 普及组] 麦森数

在这里插入图片描述
看到这个题目大家可能发现如果P为最大值的时候,可能要创建一个1000005位的数组才可能装的下这个大数,虽然我们也可以改变一下大数的规则,每个数组元素装更多位的数字,不局限于0~9。
但是这道题可以看成两个部分,第一是求出2的p次方的位数,第二是求出最后500位数,这两部分其实没有半毛钱关系。

第一部分:求出2的p次方的位数

我们想想位数的表示,想想科学计数法,perfect!10的n次方就可以视为n+1位数,那我们拥有的数字是2的p次方-1,但是这个的位数和-1没有关系,所以可以看成是求2的p次方的位数。那么现在的问题就是如何把2的p次方变成10的n次方了,简单思考发现,2的p次方=10的log10(2的p次方)的次方,所以位数可以表示为int k = log10(2的p次方)+1 = p*log10(2)+1,即向下取整。

第二部分:求出最后500位数

一开始我觉得还很简单,就一个大数乘法模拟,结果后来时间复杂度太大了,过不了。。。后来仔细看看,发现其中包含了两个大数相乘,快速幂思想,所以我在这里顺便讲一下快速幂和两个大数相乘需要注意的地方吧。

快速幂

一开始我

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值