Python60分求帮助,TLE

P1045 [NOIP2003 普及组] 麦森数

Login_ @ 2021-09-01 23:08:14

import math

a=[0]*500
p=int(input())
s=int(pow(2,p)-1)
c=s
c2=s
count=int(0)
cnt=int(500)

while c:
    count+=1
    c//=10

print(count)

while cnt:
    cnt-=1
    a[cnt]=c2%10
    c2//=10
    if 500-count==cnt:
        break

for i in range(500):
    print(a[i],end='')
    if (i+1)%50==0:
        print()

by guoyunfeng @ 2022-08-02 14:31:05

即便是用python,也不应该奢望能够算出所有的位数,浪费时间和空间。

第一,应该还是用log函数,快速求位数。 第二,应该直接用pow,求最后500位。没有必要全部算出来。

p = int(input())
from math import log

d = int(p*log(2,10)) + 1
n = pow(2,p,10**500) - 1
print(d)
s = '{:0>500d}'.format(n)
while s:
    print(s[:50])
    s = s[50:]

|