網上證明很多,雖然沒看懂。。。。
主要解決大組合數取模的情況
費馬小定理求大組合數:
a^(p-1)=1%p;
兩邊同除a
a^(p-2)=1/a%p;
c(n,m)= n!/(m!*(n-m)!)
所以c(n,m)=f(n)*qpow(f(m)*f(n-m),mod-2))%mod
預處理組合數f
先推公式,再lucas
p很大的情況 1e9+7
1 #include2 #include3 #include4 #include5 #include6 #include
7 #include8 #include9 #include10 #include11 #include12 #include13
#define clc(a,b) memset(a,b,sizeof(a))
14 #include 15
const
int maxn = 20005;16
const
int inf=0x3f3f3f3f;17
const
double pi=acos(-1
);18 typedef long
long
ll;19
using
namespace
std;
20const ll mod = 1e9+7;21
22ll exp_mod(ll a, ll b, ll p)
2331
return
res;32}
3334
ll comb(ll a, ll b, ll p)
3546 ans = (ca*exp_mod(cb, p - 2, p)) %p;
47return
ans;48}
4950 ll lucas(int n, int m, int
p)51
60return
ans;61}
6263
intmain()
6472
return0;
73 }
p在100000左右
hdu 3037
1 #include2 #include3 #include4 #include5 #include6 #include
7 #include8 #include9 #include10 #include11 #include12 #include13
#define clc(a,b) memset(a,b,sizeof(a))
14 #include 15
const
int maxn = 20005;16
const
int inf=0x3f3f3f3f;17
const
double pi=acos(-1
);18 typedef long
long
ll;19
using
namespace
std;
20//
const ll mod = 1e9+7;
2122
ll powmod(ll a,ll b,ll mod)
29return
ret;30}
31 ll fac[100005
];32
ll get_fact(ll p)
37ll lucas(ll n,ll m,ll p)
46return
ret;47}
48int
main()
57return0;
58 }
數學 Lucas定理
lucas定理解決的一類問題是c n,m p,其中n和m很大的情況 顯然如果n和m在1e7的範圍內,我們可以很輕鬆的預處理o p o 1 得到c n,m p 那麼n和m很大的時候就可以靠lucas定理了 lucas定理 c n,m p c n p,m p c n p m p p 這樣就可以把n,m很...
LUCAS定理簡述
lucas定理解決的是n,m比較大而p是小於100000質數 簡而言之就是lucas n,m c n p,m p lucas n p,m p p 其中組合數c是用任意一種計算10五次方內取模的組合數計算 比如可以預處理階乘fac i 然後直接c n,m fac n quickpow fac n m ...
lucas定理證明
lucas 定理 證明 a b是非負整數,p是質數。ab寫成p進製 a a n a n 1 a 0 b b n b n 1 b 0 則組合數c a,b 與c a n b n c a n 1 b n 1 c a 0 b 0 mod p 相同 即 lucas n,m,p c n p,m p lucas ...