มีภาษา Ajob ที่มีอักษรอันนานต์ คำที่ 1 ยาว 1 ตัวอักษร คำที่ 2 ยาว 2 ตัวอักษร ... ทุกคำมีตัวอักษรไม่ซ้ำกัน เลือกคำหนึ่งใน n คำแรก แล้วสร้าง subsequence ยาว L-k (L คือความยาวคำที่เลือก) หาจำนวนวิธี modulo p (p เป็นจำนวนเฉพาะ)
ตัวอย่าง: n=6, k=5, p=11 ผลลัพธ์คือ 7
ขั้นตอนการแก้ปัญหา
ใช้ทฤษฎี Lucas Theorem และคำนวณแฟกทอเรียล modulo p ล่วงหน้า:
- สร้างตารางแฟกทอเรียล
factและinv_factmodulo p - ใช้ Lucas Theorem คำนวณ C(n+1, k+1) mod p
ตัวอย่างโค้ด Python
memo = {}
def solve(n, k, p):
n += 1
k += 1
fact = [1]
for i in range(1, p):
fact.append(fact[-1] * i % p)
if p in memo:
inv_fact = memo[p]
else:
inv = [0, 1]
for i in range(2, p):
inv.append(p - p // i * inv[p % i] % p)
inv_fact = [1]
for i in range(1, p):
inv_fact.append(inv_fact[-1] * inv[i] % p)
memo[p] = inv_fact
ret = 1
while n > 0:
n1 = n % p
k1 = k % p
if k1 > n1:
return 0
ret = ret * fact[n1] * inv_fact[k1] * inv_fact[n1 - k1] % p
n //= p
k //= p
return ret
# ทดสอบ
n = 6
k = 5
p = 11
print(solve(n, k, p)) # ผลลัพธ์: 7
อินพุตตัวอย่าง
6, 5, 11
เอาต์พุตตัวอย่าง
7