演算法題 盧卡斯定理求組合數(Python)

2021-10-14 02:02:25 字數 995 閱讀 1093

給定n組詢問,每組詢問給定三個整數a,b,p,其中pp是質數,請你輸出cba mod p的值。

輸入格式

第一行包含整數n。

接下來n行,每行包含一組a,b,p。

輸出格式

共n行,每行輸出乙個詢問的解。

資料範圍

1≤n≤20

1≤b≤a≤10^18

1≤p≤10^5

輸入樣例:

3

5 3 7

3 1 5

6 4 13

輸出樣例:

3

32

# 快速冪

def qmi(a, b, p):

res = 1

while b:

if b & 1:

res = res * a % p

a = a * a % p

b >>= 1

return res

# 逆元計算組合數

def c(a, b, p):

j = a

res = 1

for i in range(1, b+1):

res = j * res % p

res = res * qmi(i, p - 2, p) % p

j -= 1

return res

# 盧卡斯定理

def lucas(a, b, p):

if a < p and b < p: return c(a, b, p)

else: return c(a % p, b % p, p) * lucas(a // p, b // p, p) % p

n = int(input())

for _ in range(n):

a, b, p = map(int, input().split())

print(lucas(a, b, p))

盧卡斯 Lucas 定理 逆元 求組合數

參考文章 lucas定理是用來求 c n,m mod p,p為素數的值。lucas定理 我們令n sp q m tp r.q r p 那麼 在程式設計時你只要繼續對 呼叫lucas定理即可。可以遞迴的去完成這個過程,其中遞迴終點為t 0 時間o logp n p ll lucas ll a,ll b...

數論 組合數 盧卡斯定理

使用遞推式cab ca 1b c a 1b 1 c a b c b c cab c a 1b ca 1b 1 求解階乘 1e9 7 t 1 05 t 10 5 t 1051 b a 2000 1 leq b leq a leq 2000 1 b a 2000 include using namesp...

組合數取模(盧卡斯定理)

組合數取模 盧卡斯定理 模板 const int n 1e5 5 const int mod 10007 ll fac n 用於求取階乘取模 ll n void init ll quick pow ll a,ll b return ans ll c ll n,ll m ll lucas ll n,l...