ধরুন আমাদের একটি অ্যারের উচ্চতা আছে। বিভিন্ন উচ্চতা সহ বিভিন্ন টাওয়ার আছে। অমল আর বিমল একটা খেলা খেলছে। খেলার নিয়ম নিচের মত
-
অমল সবসময় প্রথম খেলে
-
প্রতিটি মুভের সময়, বর্তমান প্লেয়ার X উচ্চতার একটি টাওয়ার নির্বাচন করে এবং একে একে একে ভেঙ্গে দেয় Y উচ্চতা Z এর প্রতিটি টাওয়ারে। [Y*Z =X; X এবং Y> 1]
-
যার কোন নড়াচড়া নেই সে গেমটি হারাবে
আমাদের বিজয়ীর নাম খুঁজে বের করতে হবে।
সুতরাং, যদি ইনপুটটি উচ্চতা =[3,1,2] এর মত হয়, তাহলে আউটপুট হবে বিমল, কারণ প্রাথমিক উচ্চতা হল {3,1,2}। যদি অমল টাওয়ার 2 থেকে উচ্চতা 1 এর দুটি টাওয়ারের উচ্চতা ভেঙ্গে দেয়, তাহলে নতুন উচ্চতা অ্যারে হবে {3,1,1,1}, বিমল উচ্চতা 3 দিয়ে টাওয়ার ভেঙে 1 উচ্চতার তিনটি টাওয়ার তৈরি করতে পারে, তাই অমলের নেই সরান তাই বিমল জিতেছে।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- একটি ফাংশন util() সংজ্ঞায়িত করুন। এটি সীমা নেবে, প্রাথমিক সীমা মান হল 10^3+5
- ফলাফল :=আকার সীমার একটি অ্যারে এবং 0 দিয়ে পূরণ করুন
- আমি পরিসীমা 2 থেকে সীমা - 1 এর জন্য, কর
- s :=একটি নতুন সেট
- 1 থেকে i এর বর্গমূলের তলা পর্যন্ত j-এর জন্য, করুন
- d :=i/j এর ভাগফল, r :=i/j এর অবশিষ্টাংশ
- যদি r 0 এর সমান হয়, তাহলে
- যদি j বিজোড় হয়, তাহলে
- ফলাফল [d]) s-তে ঢোকান
- যদি d বিজোড় হয়, তাহলে
- s-এ ফলাফল [j] ঢোকান
- যদি j বিজোড় হয়, তাহলে
- j :=0
- যখন s তে j থাকে, do
- j :=j + 1
- ফলাফল[i] :=j
- ফলাফল
- g :=util()
- প্রধান পদ্ধতি থেকে, নিম্নলিখিতগুলি করুন -
- 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