對組合數取模

2022-08-21 21:39:09 字數 1141 閱讀 6478

看這個之前建議先看一下n!……

對於組合數我們可以將其表示成階乘的形式

:c(n,k)=

。那我們不妨把這三個階乘全部表示成上個專題的形式。這樣的話,如果對於

e1>e2+e3

就可以被

p整除,

e1=e2+e3

就無法被

p整除。在無法被整除的情況下

c(n,k)=a1(a2a3)

-1

1

int mod_comb (int n, int k, int

p)

view code

另外,我們也可以用

lucas

來求。lucas定理:我們令n=sp+q , m=tp+r(q,r ≤p)則有

具體證明如下:

首先我們先來證明乙個簡單的算式:

(f!=p&&f!=0)

c(p , f)%p= p!/(f!(p-f)!)%p因為p是素數,並且分母上的f和(p-f)都要比p要小,也就是說在分母上沒有數可以把p約去,所以c(p,f) %p一定等於0。

證明完了這個算式,我們就可以開始證明盧卡斯定理。

對於(1+x)sp+q≡(1+x)sp×(1+x)q≡((1+x)p)s×(1+x)q≡(根據二項式定理展開,然後在有上面的公式,所以我們可以得到)(1+xp)s×(1+x)q≡(再根據二項式定理展開)≡

(mod p)

最終我們可以得到

下面我們來計算一下左右兩邊xtp+r的係數:

左邊=c(sp+q ,tp+r);右邊=c(s ,t)×c(q, r)

因為左邊=右邊,所以我們最後得到了盧卡斯定理。

有了盧卡斯定理,我們就有了這樣的**,這個**真的很好理解

1

int lucas(int n,int m,intp)7

return

ans;

8 }

view code

組合數取模

複習了一下組合數取模,當然推薦檢視acdreamer的部落格啦,寫的確實好啦,自己把裡面的題目全a掉了。include include include include include include include using namespace std typedef long long ll l...

組合數取模

對於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 following congr...

組合數取模

組合數c m,n 表示在m個不同的元素中取出n個元素 不要求有序 產生的方案數。定義式 c m,n m n m n 並不會使用latex qaq 根據題目中對組合數的需要,有不同的計算方法。運用乙個數學上的組合恒等式 oi中稱之為楊輝三角 c m,n c m 1,n 1 c m 1,n 證明 1.直...