0049 素数排列
* * * *
拉格朗日计划
* * * *
素数排列

公差为3330的等差数列1487、4817、8147中有三项、每一项都是素数、且两两之间互为排列关系。

不存在具有同样三条性质且只由一位数、只由两位数或只由三位数构成的等差数列,不过还存在另一个满足上述三条性质、且只由四位数构成的等差数列。

将这个数列的三项从小到大连接起来得到的十二位数是多少?

本题难度:



解答

先用筛法找出所1000到10000之间的素数,以其中每个数重排后所得的最小数字为键值整理该素数表得一字典。

遍历该字典,对其中长度不小于3的项,检查其所有三元子集能否构成等差数列,除题面中的数列外,只有2969、6299、9629能符合要求(其公差也是3330),因此结果是$296962999629$。

import itertools

target=10000
d=[0]*target
n=2

while n < target:
    for i in range(n+n,target,n):
        d[i]=d[i]+1
    n=n+1
    while n < target and d[n]>0:
        n=n+1

primeList=[k for k in range(1000,target) if d[k]==0]

primeDict={}
for p in primeList:
    q=int("".join(sorted(list(str(p)))))
    if q in primeDict:
        primeDict[q].append(p)
    else:
        primeDict[q]=[p]

print [[i,j,k] for q in primeDict for i,j,k in itertools.combinations(primeDict[q],3) if (6*min(i,j,k)+3*(max(i,j,k)-min(i,j,k)))==(i+j+k)*2]