Lucas定理學習筆記

2022-05-07 23:00:27 字數 2076 閱讀 9064

\[\equiv\rfloor}\choose \lfloor \frac\rfloor}\times \mod p

\]此處的\(\%\)表示的是取模運算。

考慮化簡\(=\frac\),不難發現當n和m都遠大於p的時候為了簡化運算我們可以將n,m,(n-m)都給按照p分段,如果\(n\%p \geq m\%p\),那麼可以發現以分數線為界,分數線上面的整數段一定和分數線下面的整數段相同,反之則分數線上面的整數段比下面的整數段大1(這種情況不難發現答案是0)。

於是我們只考慮上面和下面整數段相同的情況,先計算剩下來的邊角,根據同餘可得邊角料的部分為\(\)。

然後考慮對於這些整塊,要如何簡化運算。根據同餘定理和逆元的一些性質可以得到對於分子和分母對於p同餘且不是p的倍數的部分一定可以消掉,就像這樣:

\[\frac\\\equiv\frac \mod p

\]然後我們把分子分母同時除以乙個\(p^t\),就可以得到這部分的值為\(\lfloor\rfloor}\choose \lfloor \frac\rfloor\)了。

最後可得\(\equiv\rfloor}\choose \lfloor \frac\rfloor}\times \mod p\)。

證畢。以上內容均為自己的對於lucas定理及其證明的淺解,如有錯誤,歡迎指正。

#include#define rep(i,a,b) for(int i=a,i##_end_=b;i<=i##_end_;++i)

#define drep(i,a,b) for(int i=a,i##_end_=b;i>=i##_end_;--i)

#define mrep(i,x) for(int i=beg[x],v;v=to[i],i;i=las[i])

#define debug(x) cout<<#x<<"="while(isdigit(ch))__=(__<<1)+(__<<3)+(ch^'0'),ch=getchar();

_=__*mul;

}const int maxn=1e5+10;

int t;

ll n,m,p,fac[maxn<<1];

ll qpow(ll x,ll y)

return ret;

}ll calc(ll x,ll y)\times p_2^\times \cdots\times p_m^\)的形式,然後對於每乙個\(p_i^\),求出\(\equiv c_i \mod p_i^\),然後用中國剩餘定理合併即可就可以得到最終的\(n\choose m\)。

考慮如何求\(c_i\),可以從組合數的公式入手\(=\frac\),注意到要求逆元,所以我們先把階乘式中的\(p_i\)全部提出來最後再乘上去。

洛谷板子:

#include#define rep(i,a,b) for(int i=a,i##_end_=b;i<=i##_end_;++i)

#define drep(i,a,b) for(int i=a,i##_end_=b;i>=i##_end_;--i)

#define mrep(i,x) for(int i=beg[x],v;v=to[i],i;i=las[i])

#define debug(x) cout<<#x<<"="while(isdigit(ch))__=(__<<1)+(__<<3)+(ch^'0'),ch=getchar();

_=__*mul;

}const int maxn=1e6+10;

int tot;

ll n,m,p,d[maxn],a[maxn],c[maxn];

namespace ex

ll inv(ll x,ll mod)

}ll qpow(ll x,ll y,ll mod)

return ret;

}ll count(ll x,ll y)

ll fac(ll x,ll y,ll mod)

ll calc(ll x,ll y)

return (ret+p)%p;

}void work()

if(tmp!=1)++tot,d[tot]=a[tot]=tmp;

printf("%lld\n",calc(n,m));

}int main()

Lucas定理 學習筆記

考慮經典問題 求解 binom mod p 的值,p 是質數。這樣的問題,我們一般採用預處理階乘及階乘逆元的方式達到 mathcal o 1 查詢,但當 n,m 的範圍比較大,比如 1e9 之類的,預處理階乘顯然是不可能的了,那我們有什麼方法呢 lucas定理 binom equiv binom b...

lucas定理學習小記

lucas是數論定理,運用到oi上時,就會發現非常便利,它可以在極快的時間內算出c n,m mod p,p為質數。時間複雜度為o log 以p為底 n p lucas定理 c n,m p c n p,m p c n p,m p p 我們令n sp q m tp r q r p 那麼 在程式設計時你只...

主定理學習筆記

主定理用於求遞推方程的階。設a 1,b 1為常數,f n 為函式,t n 為非負整數,且 t n at n b f n 注意a b取值範圍 有以下三種結果 若f n o nlogba 0,則t n nlogba 若f n nlogba 則t n nlogba logn 若f n nlogba 0,且...