數論 lucas定理

2022-05-08 21:24:10 字數 1962 閱讀 2340

網上證明很多,雖然沒看懂。。。。

主要解決大組合數取模的情況

費馬小定理求大組合數:

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 #include

3 #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 #include

3 #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 ...