题目描述
形如2P−1的素数称为麦森数,这时P一定也是个素数。
但反过来不一定,即如果P是个素数,2P−1不一定也是素数。
到1998年底,人们已找到了37个麦森数。
最大的一个是P=3021377,它有909526位。
麦森数有许多重要应用,它与完全数密切相关。
任务:从文件中输入P,计算2P−1的位数和最后500位数字(用十进制高精度数表示)。
输入格式
文件中只包含一个整数P。
输出格式
第一行:十进制高精度数2P−1的位数。
第2-11行:十进制高精度数2P−1的最后500位数字。(每行输出50位,共输出10行,不足500位时高位补0)
不必验证2P−1与P是否为素数。
数据范围
1000<P<3100000
样例
输入样例:
1279
输出样例:
386
00000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000
00000000000000104079321946643990819252403273640855
38615262247266704805319112350403608059673360298012
23944173232418484242161395428100779138356624832346
49081399066056773207629241295093892203457731833496
61583550472959420547689811211693677147548478866962
50138443826029173234888531116082853841658502825560
46662248318909188018470682222031405210266984354887
32958028878050869736186900714720710555703168729087
解题思路
1.快速幂
2.取大数X后N位时可以通过X%10^N
3.10^k~10^(k+1)-1之间的数有k+1位,所以对于任意整数x的位数为math.log(x,10)+1。
则对于2^P-1有math.log(2^P,10)+1,即P*math.log(2,10)+1。
Python3 代码
import math
def pow2(a, b):
r = 1
base = a
while b != 0:
if b % 2 == 1:
r *= base
base *= base
b = b // 2
return r
P = eval(input())
res = pow2(2, P)-1
length = int(math.log(2, 10)*P+1)
print(length)
res = res % pow2(10, 500)
length = int(math.log(res, 10)+1)
res = str(res)
if length >= 500:
i = 0
while i < 500:
print(res[i:i+50])
i = i+50
else:
temp = '0'*(500-length)
res = temp + res
i = 0
while i < 500:
print(res[i:i+50])
i = i+50