मैं प्रोजेक्ट यूलर problem 338 पर फंस गया हूं। यहां मैंने अभी तक किया है ...प्रोजेक्ट यूलर नंबर 338
चलिए क्रमशः चौड़ाई और ऊंचाई x
और y
(x,y)
के साथ एक आयत को इंगित करते हैं। नए आयत बनाने के लिए आप डी चरणों के साथ विकर्ण के नीचे एक प्रकार की सीढ़ी (जैसा कि समस्या विवरण में दिखाया गया है) काटने पर विचार कर सकते हैं। लेकिन एक नया आयताकार बनाने के लिए निम्नलिखित को पकड़ना होगा: 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
के माध्यम से सभी प्रासंगिक घ पाशन और केवल एक बार (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
जी (10) अभी तक भी कितनी तेजी से एफ यह है की परवाह किए बिना हल करने के लिए लंबे समय से की आवश्यकता होगी। मुझे लगता है कि यह आवश्यक है करने के लिए या तो जहां के माध्यम से हम पाश सभी एक्स sieving एल्गोरिथ्म के कुछ प्रकार का उपयोग गिनती कितने (डब्ल्यू, ज) ज < = w < = 10 संतुष्ट, x | (डब्ल्यू * ज) , एक्स! = एच और (डब्ल्यूएक्स) | डब्ल्यू या (एक्सएच) | एक्स।
मुझे लगता है कि एक ओ (एन 2/3) एल्गोरिदम संभव होना चाहिए ... लेकिन मैं यहां फंस गया हूं!
संपादित: के बाद से मैं इसे हल करने में असमर्थ हूँ मैं मंच के लिए उपयोग नहीं है। यही कारण है कि मैं मदद मांग रहा हूँ। मैंने अन्य प्रश्नों को पूरा कर लिया है और से निपटना चाहते हैं यह प्रश्न अब!
संपादित करें 2: मुझे लगता है कि प्रमुख कारकों के क्षेत्रों पर विचार करना एक मृत अंत है। ऐसा इसलिए है क्योंकि 10 विभिन्न क्षेत्रों हैं। प्राइम क्षेत्रों के साथ आयताकारों में 0 समाधान होते हैं, सेमीफाइम क्षेत्रों के साथ आयतों में 1 समाधान होता है यदि प्राइम में से एक 2 होता है अन्यथा उनके पास 0 समाधान होते हैं। लेकिन अकेले सभी सेमिप्रिम समाधानों की गिनती बहुत लंबी होगी क्योंकि हमें सभी प्राइम्स पी को गिनने की आवश्यकता होगी जैसे कि 2 * पी जो संभव नहीं है।
संपादित 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
मैं हालांकि काम करेंगे नीचे जानवर बल कोड तोड़ने नहीं लगता कि: मैं कोड नीचे छीन लिया है। याद रखें कि यह पर्याप्त है कि हम इन तीन उपप्रोबम्स में से प्रत्येक को समाधान (एक्स, डब्ल्यू, एच) की गिनती करते हैं। ! क और xh | पिछली बार ऐसा योग की कमी 0 < एक्स < एन, 0 < ज < एन 1, एक्स = ज, अधिकतम (ज, एक्स/घंटा) < डब्ल्यू < एन 1, एक्स के लिए होता है | एच।
मुझे लगता है कि हमें इस धारणा से शुरुआत करनी चाहिए कि कुछ प्राइम पी एक्स, डब्ल्यू, एच या यहां तक कि एक्स-एच को विभाजित करते हैं और फिर देखते हैं कि हम अन्य चर के बारे में क्या कर सकते हैं। यदि यह अच्छी तरह से काम करता है, तो शायद मनमानी के लिए पी के पर विचार करें।
यदि आप अटक गए हैं, तो इसके बजाय एक और प्रयास करें। जैसा कि साइट कहती है, _ "यदि आप इसे हल नहीं कर सकते हैं, तो आप इसे हल नहीं कर सकते!" _। – hammar
आप math.stackexchange.com पर भी पूछना चाहेंगे – agf
इसके अलावा, आप प्रोजेक्ट यूलर को अपना समाधान सबमिट करने के बाद, आपको समस्या के लिए संदेश बोर्ड तक पहुंच प्राप्त होती है; यह संभव है कि किसी को पहले से ही एक इष्टतम एल्गोरिदम मिल गया है। – Edwin