在數論中,\(lucas\)定理用於快速計算\(c^m_n ~ \% ~p\),即證明\(c^m_n = \prod_ ^kc^_\)其中\(m_i\)為\(m\)的因式分解,\(n_i\)為\(n\)的因式分解,\(p\)為質數。
由\(edward~lucas\)在2023年提出。
證明:首先我們將\(c^i_p\)進行一下變式即\(c^i_j = \frac\),提出來乙個\(\frac\)也就等於\(\frac \times \frac\)。因此我們推出:
\(c^i_p \equiv \fracc^_ \equiv 0 ~(mod~p)\)。其中\(1 \leq i \leq p - 1\)然後我們得到:
\((x +1)^p \equiv c_p^01^p + c_p^1x^2 + ... + c_p^px^p\)(實際上就是個多項式展開...)
同時又同餘\(c_p^01^px^0 + c_p^p1^0x^p \equiv 1 + x^p (mod ~p)\)
因此我們又推出:
\((1 + x)^p \equiv 1 + x^p (mod ~ p)\)接著我們可以利用數學歸納法求出\((1 +x)^ \equiv 1 + x^ (mod~ p)\)。接下來將\(m\)用\(p\)進製數表示就是\(\sum_ ^km_ip^i\)。
並且我們還可以看出\(\sum_^ c_n^mx^n = (1 +x)^m = \prod _^k((1 + x)^)^ = \prod _^k(1 + x^)^ = \prod _^k(\sum_^ c_^x^)\)
也就等於\(\prod _^k(\sum_^ c_^x^) = \sum_^ (\prod_^kc_^)x^n ~ (mod ~ p)\)
因為\(n_i\)為\(n\)的\(p\)進製表示,因此得證。
模板:(link)
#include #include #include #include #include using namespace std ;
typedef long long ll ;
const int maxn = 100010 ;
ll n, m, p, x[maxn] ;
inline ll read()
inline ll quickpow(ll a, ll b) return ans ;
}inline ll c(ll a, ll b)
inline ll lucas(ll a, ll b)
int main() return 0 ;
}
盧卡斯 Lucas 定理
之前有寫過一篇部落格是求組合數 取模 的兩種方法。那篇文章裡介紹的方法其實也還有侷限性,pascal打表由於記憶體的限制一般只用於求取1000以內的組合數,而使用逆元套公式的方法其實也只適用於求取的組合數 c n,m p中,n 和 m均不大於要求的模數 p 這樣就導致了乙個很尷尬的問題 如果要求取的...
盧卡斯(Lucas)定理
c nm modp cn pm p cnm odpm modp modp c n m mod p c times c mod p cnm mo dp c n pm p cnmo dpmm odp modp p為素數 int qpow ll b,int n,int mod return res int...
盧卡斯定理 Lucas
當 p 為質數,1 le m le n 時,求組合數 c bmod 對於質數 p,有 begin c equiv c cdot c pmod end 其中 n p 和 m p 為整除。引理1 begin c equiv frac cdot c equiv 0 pmod end 引理1證明 begin...