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