0234 半可约数
* * * *
拉格朗日计划
* * * *
半可约数

对于任意大于等于4的自然数n,定义其下素数平方根$lps(n)$为不超过$\sqrt n$的最大素数,并其上素数平方根$ups(n)$为不小于$\sqrt n$的最小素数。

例如$lps(4)=2=ups(4)$,$lps(1000)=31$,$ups(1000)=37$。

若$lps(n)$和$ups(n)$中有且只有一个能整除n,就称n是半可约的。

所有不超过15的半可约数之和为30,这些数是8、10和12。注意15并不是半可约整数,因为$lps(15)=3$和$ups(15)=5$都能整除$15$。

不超过1000的半可约数共有92个,它们的和是34825。

求所有不超过999966663333的半可约数之和。

本题难度:



解答

设p,q是两个相邻的素数,那么对满足$p^2 < n < q^2$的n而言,只要n恰好只能被p,q中的一个整除,它就是半可约的。

容易验证$ups(999966663333)=1000003$,因此先用筛法找出不超过1000003的所有素数,再用上述规则遍历求和,结果是$1259187438574927161$。

target=1000004
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(2,target) if d[k]==0]

r=0
for i in range(len(primeList)-1):
    p,q=primeList[i],primeList[i+1]
    r+=sum(j for j in range(p*p+p,q*q,p) if j%q>0 and j < 999966663334)
    r+=sum(j for j in range(q*q-q,p*p,-q) if j%p>0 and j < 999966663334)

print r