【发布时间】:2019-11-27 09:10:58
【问题描述】:
对于输入数字N,我试图找到特殊对的计数(x,y),以便满足以下条件:
x != y1 <= N <= 10^500 <= x <= N0 <= y <= N-
F(x) + F(y)是素数,其中F是数字的所有数字的总和
最后打印出计数模1000000007的输出
示例输入: 2
样本输出: 2
解释:
- (0,2) 因为
F(0)+F(2)=2是素数- (1,2) 因为
F(1)+F(2)=3是素数- (2,1) 不被视为 (1,2) 与 (2,1) 相同
我的代码是:
def mod(x,y,p):
res=1
x=x%p
while(y>0):
if((y&1)==1):
res=(res*x)%p
y=y>>1
x=(x*x)%p
return res
def sod(x):
a=str(x)
res=0
for i in range(len(a)):
res+=int(a[i])
return res
def prime(x):
p=0
if(x==1 or x==0):
return False
if(x==2):
return True
else:
for i in range(2,(x//2)+1):
if(x%i==0):
p+=1
if(p==0):
return (True)
else:
return(False)
n=int(input())
res=[]
for i in range (n+1):
for j in range(i,n+1):
if(prime(sod(int(i))+sod(int(j)))):
if([i,j]!=[j,i]):
if([j,i] not in res):
res.append([i,j])
count=len(res)
a=mod(count,1,(10**9)+7)
print(res)
print(a)
我希望9997260736 的输出是671653298,但错误是代码执行超时。
【问题讨论】:
-
最好为 [something] 以下的所有素数生成可能的总和,然后对该数字总和进行数字化,而不是遍历所有数字并分解每个总和以检查其是否为素数。
-
我的意思是:到目前为止,您正在执行 N*N 次传递,每次计算 x 和 y 的数字总和(还不错)并分解每个总和以检查它是否鼎盛时期。这意味着对于 sum
s,您正在检查它是否是素数s+1次! (对于 0+s, 1+(s-1), ..., (s-1)+1, s+0) -
您可以做的是:从 2 开始遍历素数(您将只检查每个素数一次)。,求和(对于 7: 0+7, 1+6 , 2+5, 3+4),并且对于总和的两个元素生成它们可能的 x 和 y 值(例如,给定“1”和 N=101,您可以做 1、10、100;给定“2”,您会得到2、11、20、101……)。
-
@rossum 那是
!=,不是x!... 这意味着“不相等” -
@Guy [0,12] = 3 因为 F(0)+F(12)=0+3=3 这是素数(数字 12 的数字总和为 3)对于其他集合类似
标签: python primes modulo sum-of-digits