當n、m為大數,p為素數時,
lucas定理是用來求 c(n,m) mod p的
值。適用領域範圍
:在數論中求大組合數取模。
表示式:
c(n,m)%p=c(n/p,m/p)*c(n%p,m%p)%p
lucas定理:我們令
n=sp+q , m=tp+r
. (q ,r ≤p)
那麼:(在程式設計時你只要繼續對
呼叫lucas定理即可。
**可以遞迴的去完成這個過程,其中遞迴終點為
t = 0 ;
時間 o(log
p(n)*p))。
要證:c(n,m)%p=c(n/p,m/p)*c(n%p,m%p)%p
即證:c(n,m)=c(n/p,m/p)*c(n%p,m%p)
已知p是素數,n、m、p為整數。
1.由二項式定理得:
2.由費馬小定理得:
(1)式 :(1+x)^p ≡ (1+x)(mod p).
(2)式 :(1+x^p)≡ (1+x)(mod p). (因為x^p與x取模p同餘,同時加1也同餘 )
則由上式可知:
(1+x)^p ≡ (1+x^p)(mod p) (記為(3)式)
3.n = n/p*p + n%p.則:
(1+x)^p(mod p) = (1+x)^(n/p*p)*(1+x)^(n%p)(
mod p)
由式3得: (1+x)^p(
mod p
)= (1+x^p)^(n/p)*(1+x)^(n%p)
(mod p
)將上式由二項式公式可轉化為:(這一排你用手寫看一下吧,這編輯器裡太難敲了……)
∑(n,z=0)c(n,z)* x^z (mod p)=∑(n/p,i=0)c(n/p,i)* x^(p*i)*∑(n%p,j=0)c(n%p,j)* x^j(
mod p)
任意乙個z,必存在乙個i,j滿足:x^z = x^(p*i)*x^j(即滿足:n = n/p*p + n%p),當且僅當:
i=z/p,j=z%p
時成立此時:
c(n,m)=
c(n/p,m/p)*c(n%p,m%p) 成立
得證!
**求解過程中,不斷將c(n/p,m/p)拆分化簡,實質是一直在計算c(n%p,m%p),即:
c(n,m)%p=c(n/p,m/p)*c(n%p,m%p)%p
等價於c(n,m)%p=c(n/p/p,m/p/p)*c(n/p%p,m/p%p)%p
等價於c(n,m)%p=c(n/p/p/p,m/p/p/p)*c(n/p/p%p,m/p/p%p)%p
等價於…
直到拆分至m=0,遞迴完成。
#includeusing namespace std;
typedef long long ll;
ll fastmod(ll a,ll b,ll p) //費馬小定理
return cnt;
}ll comb(ll a,ll b,ll p) //組合數
{ ll ca=1,cb=1,tmp=1;;
if(aa-b) b=a-b;
for(ll i=0;i>n>>m>>p)
{ll ans=lucas(n,m,p);
cout<
~step by step
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 ...
瞎搞 Lucas定理證明
求證cn m i 0kc nimi modp 其中m ki 0mip i n ki 0nip i p是質數。首先,我們知道,n0 nmodp,m 0 mmodp 那麼原式相當於求證cn m c np mp cnmodp mmod pmodp 這樣就可以歸納一發證明整個定理了。首先我們知道,對於任意的...
Lucas定理以及證明
對著無數篇部落格終於 yy 懂了 lucas 定理,興奮之際趕緊寫下來 如果 p 是質數,那麼 c equiv c times c mod p 首先我們要知道乙個性質 如果 p 為質數,那麼有 c equiv 0 mod p 其中 n ne 0,p 這個很顯然吧,考慮把組合數的式子寫出來 c p n...