本题的策略非常直接,先生成所有的站点,再找出其中的最长不减序列的长度即可,前者利用周期性,后者则是标准算法。
最终结果是$9936352$。
注:本题数据量较大,故代码为Python 3(对pow内建函数和list都有一定优化),代码中还打印了进度信息。
s=0
for k in range(1,31):
n=k**5
stations=set()
for i in range(0,2*n+1):
if (p:=(pow(2,i,n),pow(3,i,n))) in stations:
break
else:
stations.add(p)
y=[j for i,j in sorted(stations)]
n=len(y)
M=[0]*(n+1)
L=0
for i in range(n):
a=1
b=L
while a<=b:
c=(a+b)//2+(a+b)%2
if y[M[c]]<=y[i]:
a=c+1
else:
b=c-1
M[a]=i
L=max(L,a)
s+=L
print(k,"completed")
print(s)
|