สมมติว่าเรามีสีอาร์เรย์ แทนสีสำหรับ n-gon ปกติหนึ่งอัน จุดยอดแต่ละจุดของ n-gon นี้จะถูกสุ่มสีด้วยหนึ่งใน n สีที่แตกต่างกันในอาร์เรย์ที่กำหนด เราต้องหาจำนวนชุดย่อยพิเศษของจุดยอดหลายเหลี่ยมเพื่อให้ชุดย่อยเหล่านี้ตรงตามเงื่อนไขเหล่านี้ -
- ขนาดของเซตย่อยต้องมีอย่างน้อยสองขนาด
- หากเราลบจุดยอดซึ่งมีอยู่ในเซตย่อย ออกจากรูปหลายเหลี่ยม (ขอบที่อยู่ติดกันของจุดยอดเหล่านั้นจะถูกลบออกด้วย) จากนั้นจุดยอดและขอบที่เหลือจะสร้างเส้นทางที่ต่อเนื่องกัน
- เส้นทางเหล่านั้นไม่ควรมีจุดยอดสองจุดที่มีสีเดียวกัน
เราต้องนับจำนวนชุดย่อยดังกล่าวที่มีอยู่ หากคำตอบมีขนาดใหญ่เกินไป ให้คืนค่า mod ผลลัพธ์ 10^9 + 7
ดังนั้น หากอินพุตเป็นเหมือนสี =[1,2,3,4] ผลลัพธ์จะเป็น 11
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- จำนวน :=แผนที่ว่างซึ่งค่าทั้งหมดจะเป็นรายการที่ว่างเปล่า
- n :=ขนาดของสี
- สำหรับฉันในช่วง 0 ถึงขนาดของสี - 1 ทำ
- แทรก i ที่ท้ายการนับ[colors[i]]
- คำตอบ :=0
- สำหรับฉันในช่วง 2 ถึง n ทำ
- answer :=answer + nCr(n, i)
- สำหรับแต่ละ i ในรายการคีย์ทั้งหมดของการนับ ทำ
- l0 :=นับ[i]
- n0 :=ขนาดของ l0
- ถ้า n0> 1 แล้ว
- สำหรับฉันในช่วง 0 ถึง n0-2 ทำ
- สำหรับ j ในช่วง i+1 ถึง n0 - 1 ทำ
- d1 :=l0[j] -l0[i]
- d2 :=l0[i] -l0[j] + n
- ถ้า d1 <=n-3 หรือ d2<=n-3 แล้ว
- answer :=ตอบ - 1
- สำหรับ j ในช่วง i+1 ถึง n0 - 1 ทำ
- สำหรับฉันในช่วง 0 ถึง n0-2 ทำ
- ส่งคืนคำตอบ
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
from collections import defaultdict from math import factorial def nCr(n, i): if n==1: return 1 return factorial(n)//factorial(i)//factorial(n-i) def solve(colors): count = defaultdict(list) n = len(colors) for i in range(len(colors)): count[colors[i]].append(i) answer = 0 for i in range(2, n+1): answer += nCr(n, i) for i in count.keys(): l0 = count[i] n0 = len(l0) if n0 > 1: for i in range(n0-1): for j in range(i+1, n0): d1 = l0[j] -l0[i] d2 = l0[i] -l0[j] + n if d1 <= n-3 or d2<= n-3: answer -=1 return answer colors = [1,2,3,4] print(solve(colors))
อินพุต
[1,2,3,4]
ผลลัพธ์
11