![](/img/trans.png)
[英]How to find perfect squares in a range efficiently when the inputs are large numbers in Python
[英]How to optimize and find output for large inputs?
對於輸入數字N
,我試圖找到滿足以下條件的特殊對(x,y)
的數量:
x != y
1 <= N <= 10^50
0 <= x <= N
0 <= 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
但誤差代碼執行超時。
已經發布了有點太長的評論,所以改變它來回答:
考慮此類問題時,不要將問題直接轉化為代碼,而是看看您可以只做一次或以不同的順序做些什么。
到目前為止,您正在執行N*N
次傳遞,每次計算 x 和 y 的數字總和(不是那么糟糕)並分解每個總和以檢查它是否是質數(真的很糟糕)。 這意味着對於 sum s
您正在檢查它是否是素數s+1
次! (對於 0+s, 1+(s-1), ..., (s-1)+1, s+0)。
你可以做些什么不同的事情?
讓我們看看我們所知道的:
許多數字的數字和是相同的。
對於許多值, sod(x) 和 sod(y) 的總和是相同的。
Number 在第 1 次和第 n 次檢查期間是素數(並且檢查它是否是素數的成本很高)。
所以最好的辦法是只計算一次素數,並且每個和只計算一次。 但是當我們有很多數字時怎么做呢?
換個思路:得到素數,把它分成兩個數(sodx和sody),然后從這些數中生成x和y。
例子:
質數p = 7
。 這給出了可能的總和為 0+7、1+6、2+5、3+4。
然后對於每個總和,您可以生成一個數字,例如,對於 N=101 和 sod=1,您有 1、10、100,對於 sod=2,您有 2、11、20、101。您可以存儲它,但是產生這個應該不會那么糟糕。
其他優化:
您必須考慮如何使用 N 限制生成素數:
給定 N 與 lenN 數字(記住,lenN 是 ~log(N)),可能的最大數字總和是 9*lenN(對於 N 僅由 9 組成)。 這意味着我們的 sodx 和 sody <= 9*lenN,所以素數p = sodx + sody <= 18*lenN
看:這意味着 18*lenN 檢查數字是否為素數 vs N*N 檢查您以前的算法!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.