我卡在項目歐拉problem 338。這是我迄今爲止所做的...項目歐拉數338
讓我們指出一個寬度和高度分別爲x
和y
的長方形(x,y)
。爲了形成新的矩形,您可以考慮用d步驟沿對角線切割一種樓梯(如問題描述中所示)。但要形成一個新的矩形,必須滿足以下條件:d|x
和(d-1)|y
或(d+1)|y
。新的矩形然後變成(x/d*(d-1), y/(d-1)*d)
或(x/d*(d+1), y/(d+1)*d)
。顯然,新的矩形區域與舊的矩形區域相同。
這是足夠G(10)=55
和G(1000)=971745
通過所有相關d循環並增加所有新矩形的一組小心計數(x,y)
和(y,x)
只有一次確認。
這種方法的主要問題是可以用兩種不同的方式創建一個新的矩形。例如,(9,8)
可以轉換爲(6,12)
和(12,6)
,其中d=3
和d-1
或d+1
分爲y
。或(4,4)
的另一示例分別轉換爲(2,8)
和(8,2)
,分別轉換爲d=2
和d=1
。我很幸運地讀this blog post。它不需要通過搜索其中一個邊來檢查重複項。
def F(w, h):
if w&1 and h&1: return 0
if w<h: w,h = h,w
r = 0
x = 1
while x**2 <= w*h:
if (w*h)%x!=0 or x==h:
x += 1
continue
if w%(w-x)==0 or x%(x-h)==0:
r += 1
x += 1
return r
def G(N):
s = 0
for w in range(1, N+1):
for h in range(1, w+1):
s += F(w,h)
return s
G(10 )需要的時間太長了,無論F的速度有多快,雖然解決。我認爲有必要使用某種篩選算法,其中我們循環遍歷所有的x(w,h)滿足以下條件:計算有多少(w,h)滿足h(其中x是最大值) ,x!= h和(wx)| w或(xh)| x。
我認爲一個O(n 2/3)算法必須是可能的......但我被卡在這裏!
編輯:我沒有訪問該論壇,因爲我無法去解決它。這就是我尋求幫助的原因。我已經完成了大多數其他問題,現在想要解決這個問題!
編輯2:我認爲考慮素因素的區域是一個死衚衕。這是因爲有不同的領域。具有素數區域的矩形有0個解,具有半素性區域的矩形如果其中一個素數是2,則有1個解,否則它們有0個解。但是,單獨計算所有半解的解決方案將需要很長的時間,因爲我們需要計算所有質數p,使得2 * p 24這是不可行的。
編輯3:我剝了下來代碼:
def G(N):
s = 0
for x in range(1, N):
for h in range(1, N+1):
if x==h: continue
for w in range(max(h, x**2//h), N+1):
if (w*h)%x==0 and x%(w-x)==0 and x%(x-h)==0:
s -= 1
for x in range(1, N):
for h in range(1, N+1):
if x==h: continue
for w in range(max(h, x**2//h), N+1):
if (w*h)%x==0 and w%(w-x)==0:
s += 1
for x in range(1, N):
for h in range(1, N+1):
if x==h: continue
for w in range(max(h, x**2//h), N+1):
if (w*h)%x==0 and h%(x-h)==0:
s += 1
return s
我不認爲打破了蠻力代碼將下降,雖然工作。請記住,我們只需對這三個子問題中的每一個計算解(x,w,h)就足夠了。最後這樣求和將有約束0 < X < N,0 <ħ< N + 1,X = H,最大值(H,X /小時)<瓦特< N + 1,X |!WH和XH |小時。
我認爲一些素數p分爲X,W,我們應該假定啓動H或甚至x-H,然後看看我們可以推導出其他變量。如果這樣做效果很好,那麼可以考慮任意k的p k。
如果卡住了,請換另一個。正如該網站所說,「如果你解決不了,那麼你解決不了!」。 – hammar
你也可能要問上math.stackexchange.com – agf
此外,提交您的解決方案,項目歐拉後,您可以訪問該問題的留言板;有可能有人已經找到了最佳算法。 – Edwin