สมมติว่าเรามีความสูงของอาร์เรย์ มีหอคอยที่แตกต่างกัน n แห่งที่มีความสูงต่างกัน Amal และ Bimal กำลังเล่นเกม กติกาของเกมมีดังนี้
-
อามาลเล่นก่อนเสมอ
-
ในระหว่างการเคลื่อนที่แต่ละครั้ง ผู้เล่นปัจจุบันจะเลือกหอคอยที่มีความสูง X และแยกออกเป็นหอคอย Y ที่มีความสูง Z ต่างกัน [Y*Z =X; X และ Y> 1]
-
ใครไม่ขยับจะแพ้เกมนี้
เราต้องหาชื่อผู้ชนะให้เจอ
ดังนั้น หากอินพุตเท่ากับความสูง =[3,1,2] ผลลัพธ์จะเป็น Bimal เนื่องจากความสูงเริ่มต้นคือ {3,1,2} หาก Amal ทำลายความสูงของหอคอย 2 เป็นสองหอคอยที่มีความสูง 1 อาร์เรย์ความสูงใหม่จะเป็น {3,1,1,1} Bimal สามารถทำลายหอคอยที่มีความสูง 3 และสร้างหอคอยสามแห่งที่มีความสูง 1 ได้ ดังนั้น Amal จึงไม่มี ย้ายดังนั้น Bimal ชนะ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดฟังก์ชัน util() การดำเนินการนี้จะใช้เวลาจำกัด ค่าขีดจำกัดเริ่มต้นคือ 10^3+5
- ผลลัพธ์ :=อาร์เรย์ของขนาดที่จำกัดและเติมด้วย 0
- สำหรับฉันอยู่ในช่วง 2 เพื่อ จำกัด - 1 ทำ
- s :=ชุดใหม่
- สำหรับ j ในช่วง 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 :=util()
- จากวิธีหลัก ให้ทำดังต่อไปนี้ −
- r :=0
- ส่วนสูงแต่ละคน ทำ
- r :=r XOR g[i]
- ถ้า r ไม่ใช่ศูนย์ แล้ว
- ส่งคืน "Amal"
- มิฉะนั้น
- ส่งคืน "Bimal"
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
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