(a+b)%p = a%p + b%p ;
(a-b)%p = a%p - b%p ;
(a*b)%p = a%p * b%p ;
但是(a
b\frac
ba)%p ≠ amo
dpbm
od
p\frac
bmodpa
modp
這種時候就要用到逆元
在求組合數時 c(nm
)\tbinom
(mn
) = n!m
!∗(n
−m)!
\frac
m!∗(n−
m)!n
!%p ≠ n!m
odpm
!∗(n
−m)!
modp
\frac
m!∗(n−
m)!m
odpn
!mod
p, 求逆元的時候用到費小馬定律
費小馬定律因為ap-1 = ap-2 * a , 所以ap-2 為a 的逆元 ,即(x若a 與 p互質且p為質數時 ,a(p-1)%p== 1%p ;
a\frac
ax)%p=(x%p)*(ap-2%p)%p ;
求c( nm
)\tbinom
(mn)%p
求出所有小於n的階乘用f[i] 表示(f[i]%p)
求m! 的逆元即f[m] 的逆元 a = fastpow(f[m],p-2) (快速冪取模)
求(n-m)! 的逆元 b = fastpow(f[n-m],p-2)
c( nm
)\tbinom
(mn
)%p = f[n] * a * b ;
模板:
#include
using namespace std ;
typedef
long
long ll ;
const
int n=
1e5+5;
const
int mod =
998244353
;int f[n]
; ll n , k , p ;
ll fastpow
(ll a , ll b)
return res ;
}int
main()
cout << ans << endl ;
return0;
}
參考及詳細解說—> 逆元求組合數
還有乙個其他方法求組合數的 —> 求組合數的各種方法
盧卡斯 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...
乘法逆元 組合數
要求 a b mod p的值,但 a 很大,無法直接求得a b的值時,就要用到乘法逆元。b x 1 mod p x的最小正整數解k叫做b關於模p的乘法逆元。a b mod p a k mod p 證明 k n p 1 b a k mod p a n p 1 b mod p a b n p 1 mod...
組合數學 求組合數
對於求組合數,要根據所給資料範圍來選擇合適的演算法 這道題中所給的資料範圍適合用打表的方法直接暴力求解 先用4e6的複雜度預處理出所有的情況,再用1e4的複雜度完成詢問即可 include using namespace std const int n 2010 const int mod 1e9 ...