1. 程式人生 > >[演算法 18_001] Lucas 定理與大組合數取餘

[演算法 18_001] Lucas 定理與大組合數取餘

Lucas 定理

該定理是用來求當 ( n m ) 中的

m , n 很大而 p 為素數時, (
n m ) ( mod p )
的值。
Lucas 定理:令
n = s p + q , m = t p + r . ( q , r < p )

那麼:

( n m ) ( s p + q t p + r ) ( s t ) ( q r ) ( mod p )
則在程式設計時,只需繼續對 ( s t ) 應用 Lucas 定理即可。程式碼可以遞迴地完成這個過程,終止條件是 t = 0 。時間複雜度為 O ( log p n p )

大組合數取餘

應用 Lucas 定理,可以將求 ( n m ) ( mod p ) 的問題轉化為求 ( q r ) ( s t ) ( mod p ) 的問題,因為 q , r < p 可對 ( q r ) ( mod p ) 直接求組合數,而對 ( s t ) ( mod p ) 遞迴使用 Lucas 定理求值。
而對於小組合數有:

( q r ) q ! r ! ( q r ) ! ( mod p )
對於階乘很大的情況,計算機程式設計時可能需要對分子分母分別取餘,但是對於除法不能輕易使用同餘定理(只在 + , , 三種運算下有效),所以希望可以將除法取餘轉換為等價的乘法取餘,這時便需要另外重要的知識:逆元以及費馬小定理。

逆元

逆元定義:對於正整數 a p ,如果有 a x 1 ( mod p ) ,那麼把這個同餘方程中 x 的最小正整數解叫做 a ( mod p ) 的逆元。

費馬小定理

定義:假如 p 是質數,且 gcd ( a , p ) = 1 ,即 a , p 互質,那麼 a p 1 1 ( mod p )

由費馬小定理可得:

相關推薦

[演算法 18_001] Lucas 定理合數

Lucas 定理 該定理是用來求當 (nm) ( n m

Lucas定理合數模的求法總結

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Lucas定理應用分析——合數

    首先給出Lucas(盧卡斯)定理:     有非負整數A、B,和素數p,A、B寫成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

Lucas定理 合數

對於C(n, m) mod p。這裡的n,m,p(p為素數)都很大的情況。就不能再用C(n, m) = C(n - 1,m) + C(n - 1, m - 1)的公式遞推了。 這裡用到Lusac定理 For non-negative integers m and n and a prime p, the f

Lucas定理——合數

大組合數取模,求C[n][m]%p 公式:C[n][m]%p == C[n%p][m%p]*C[n/p][m/p]%p 注意,Lucas的要求是n,m<=10^5,如果n,m>=10^5,那麼要求p<=10^5 楊輝三角: f[0][

HDU 3037 Saving Beans (Lucas定理求大數合數

#include <iostream> #include <cstdio> using namespace std; typedef long long ll; const

合數模-盧卡斯定理

求左邊的     為: 通過觀察你會發現當且僅當i = t , j = r ,能夠得到的係數,及。 所以,。得證。 -------------------------------------------------------------------------------------------

Lucas定理(求合數,例題FZU2020,HDU3944)

Lucas定理:用於求C(n,m) mod p,其中p為素數 證明等在網上都可以找到,我也不是很懂就略過了(懂了補上)。 直接貼出用法吧: 主要程式碼就兩行,需要用到的知識有快速冪和求逆元(計算組合數),必要的時候需要打表(計算階乘) 核心程式碼:   ll l

合數

考慮C(n,m)%P 情況一:n,m很大,P為素數 處理小範圍的階乘和階乘的逆元 用盧卡斯定理即可。盧卡斯定理: 情況二: 當P= p1∗p2∗p3∗...∗pn 求出[Cmn]分別在[p1,p2,p3,…,pn]模意義下的結果,記為 [m1,m

10943 How do you add?【合數(遞推)】

 Larry is very bad at math — he usually uses a calculator, whichworked well throughout college. Unforunately, he is now struck ina deser

盧卡斯定理Lucas(求合數)

貼一份盧卡斯定理模板Lucas定理是用來求 c(n,m) mod p,p為素數的值。//C(n,m)=n!/((n-m)!*m!) //性質1 C(n,m)= C(n,n-m);性質2 C(n,m)=C

Lucas 合數

.com 技術 利用 費馬小定理 題目 image 證明 max i++ 題目:HDU 3037 題意:有n個樹,m個堅果,放到n個樹裏,可以不放完,有多少種方法。 分析: 得到組合數了。 大組合數什麽費馬小定理,Lucas定理都來了; 總的說,不能用二維地推

Lucas定理合數

引入 楊輝三角 std 數據 組合數取模 有關 ans main include 引入: 組合數C(m,n)表示在m個不同的元素中取出n個元素(不要求有序),產生的方案數。定義式:C(m,n)=m!/(n!*(m-n)!)(並不會使用LaTex QAQ)。 根據題目中對組合

合數模&&Lucas定理題集

pac 假設 次方 href ace 範圍 統一 lucas定理 != 題集鏈接: https://cn.vjudge.net/contest/231988 解題之前請先了解組合數取模和Lucas定理 A : FZU-2020 輸出組合數C(n, m) mod p (

合數模(楊輝三角打表 & 求逆元(擴充套件歐幾里得、費馬小定理、尤拉定理、線性求法) & Lucas

    在acm競賽中,組合數取模的題目還是經常會見到的,所以這是有必要掌握的一個演算法。我本人就因為這個東西而被坑了很多次了= =之前的部落格也都扯過了,就不多說了,下面進入正題。 (1)楊輝三角求組合數     楊輝三角這個東西應該都不陌生,三角的兩邊始終為一,之後向

合數模(楊輝三角+Lucas定理+模合數

/* (1) 1 <= m <= n <= 1000 和 1 <= p <= 10^9 ( p可以是任何數 ) 這個問題比較簡單,組合數的計算可以靠 楊輝

Lucas定理(求合數模) 擴充套件Lucas定理(解決模數非質情況)

在比賽時 , 如果遇到CmnCnm的n比較大 , 我們不能通過預處理階乘和逆元來計算 , 而題目又要求對答案取一個質數模的時候 , 我們可以用Lucas定理來簡化計算 Lucas 定理: 定義 : n,m是非負整數,p是素數時 , Lucas(

hdu5968(合數Lucas定理)

瞬間移動 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Sub

3037 Saving Beans (數論,合數模,lucas定理

也是通過看別人的程式碼才知道這個題應該怎麼做:Lucas定理題目相當於求n個數的和不超過m的方案數。如果和恰好等於m,那麼就等價於方程x1+x2+...+xn = m的解的個數,利用插板法可以得到方案數為:(m+1)*(m+2)...(m+n-1)  = C(m+n-1,n-1) = C(m+n-1,m)現在

hdu-3037-合數模-Lucas定理

http://acm.hdu.edu.cn/showproblem.php?pid=3037 題意很簡單 求C(n+m,m)%p,P是小於1e5的素數 n,m《1e18 那麼得到