मान लीजिए कि हमारे पास एक सरणी ऊंचाई है। अलग-अलग ऊंचाई के साथ अलग-अलग टावर हैं। अमल और बिमल एक खेल खेल रहे हैं। खेल के नियम नीचे की तरह हैं
-
अमल हमेशा पहले खेलता है
-
प्रत्येक चाल के दौरान, वर्तमान खिलाड़ी ऊंचाई X के एक टॉवर का चयन करता है और इसे Y प्रत्येक ऊंचाई Z के विभिन्न टावरों में तोड़ देता है। [वाई * जेड =एक्स; एक्स और वाई> 1]
-
जिसके पास कोई चाल नहीं है वह खेल हार जाएगा
हमें विजेता का नाम खोजना होगा।
इसलिए, यदि इनपुट ऊंचाई =[3,1,2] की तरह है, तो आउटपुट बिमल होगा, क्योंकि प्रारंभिक ऊंचाई {3,1,2} हैं। अगर अमल टावर 2 की ऊंचाई को 1 ऊंचाई के दो टावरों को तोड़ता है, तो नई ऊंचाई सरणी {3,1,1,1} होगी, बिमल ऊंचाई 3 के साथ टावर तोड़ सकता है और ऊंचाई 1 के तीन टावर बना सकता है, इसलिए अमल के पास नहीं है आगे बढ़ो इसलिए बिमल जीतता है।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- उपयोग() फ़ंक्शन को परिभाषित करें। यह सीमा लेगा, प्रारंभिक सीमा मान 10^3+5 . है
- परिणाम:=आकार सीमा की एक सरणी और 0 से भरें
- मैं श्रेणी 2 से सीमा -1 तक के लिए
- s :=एक नया सेट
- जे के लिए श्रेणी 1 से i के वर्गमूल के तल तक
- d :=i/j का भागफल, r :=i/j का शेष
- यदि r, 0 के समान है, तो
- यदि j विषम है, तो
- परिणाम डालें[d]) s में
- यदि d विषम है, तो
- परिणाम[j] को s में डालें
- यदि j विषम है, तो
- j :=0
- जबकि j, s में मौजूद है, करें
- j :=j + 1
- परिणाम[i] :=j
- वापसी का परिणाम
- g :=उपयोग ()
- मुख्य विधि से, निम्न कार्य करें -
- r :=0
- ऊंचाई में प्रत्येक i के लिए, करें
- r :=r XOR g[i]
- यदि r शून्य नहीं है, तो
- वापस "अमल"
- अन्यथा,
- रिटर्न "बिमल"
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
def util(limit=10**3+5): result = [0] * limit for i in range(2, limit): s = set() for j in range(1, int(i**0.5)+1): d, r = divmod(i, j) if r == 0: if j & 1: s.add(result[d]) if d & 1: s.add(result[j]) j = 0 while j in s: j += 1 result[i] = j return result g = util() def solve(height): r = 0 for i in height: r ^= g[i] if r: return "Amal" else: return "Bimal" height = [3,1,2] print(solve(height))
इनपुट
[3,1,2]
आउटपुट
Bimal