簡體   English   中英

如何優化和尋找大輸入的輸出?

[英]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)

我期望的輸出9997260736671653298但誤差代碼執行超時。

已經發布了有點太長的評論,所以改變它來回答:

考慮此類問題時,不要將問題直接轉化為代碼,而是看看您可以只做一次或以不同的順序做些什么。

到目前為止,您正在執行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM