同一步下的不同選擇,可以通過累加得到方案數。
整個流程的方案數可以由每一步的方案數相乘得到。
有了加法原理和乘法原理,就可以解決一些沒有選擇導致分支的問題了。
例題1
有 \(n\) 個籃子,第 \(i\) 籃子有 \(a_i\) 有水果,每個水果各不相同,問每個籃子選出一個得到的水果的方案數。
解答:
用加法和乘法原理,那麼每個籃子選出的方案數為 \(a_i\) ,總共就是 \(\prod a_i\) 種方案。
從 \(n\) 個不同元素中選出 \(m\) 個,按照一定順序排列,簡而言之就是選出一個數列的方案數。
從 \(n\) 個不同元素中選出 \(m\) 個的方案數,換句話就是選出一個集合的方案數。
其實排列數可以看做在選出 \(m\) 個數後還有對這 \(m\) 個數做一個全排列,所以多一個 \(m!\)
因為組合數我們用得多一點,所以我們一般用二項式係數來表示組合數,也就是說:
然後定義一些離譜的情況: \(m>n\) 或者 \(m<0\) 時, \(\binom{n}{m}=0\)
多重集合,也叫可重集。一個多重集合 \(S=\{a_1\cdot n_1,a_1\cdot n_2,...,a_m\cdot n_m\}\) (\(n_i\) 表示元素個數, \(a_i\) 表示元素)的排列數(也被稱為多重組合數):
相當於是所有數的全排列數再除去相同元素的全排列數。
順便補充一嘴:
一個多重集合 \(S=\{a_1\cdot n_1,a_1\cdot n_2,...,a_k\cdot n_k\}\) 的組合數,就是從中選出 \(r\) 個,得到不同可重集的方案數。
這個怎麼弄?先來個簡單的的,我們使 \(r<n_i\)。
這個我們考慮用插板法來求。可以看做我們現在有 \(r\) 個小球,然後現在往裡面插板來分組。
最初的時候,我們有 \(r\) 個球,那麼我們有 \(r+1\) 個位置是可以插空的。當我們插入了一個板子之後,我們可以插入的位置就又多了一個,後面就同理了。
於是乘法原理加上除去板子的全排列可以得到答案:
現在考慮把 \(r<n_i\) 的限制拿掉,怎麼做?
這個要容斥原理!但是在這篇部落格里我們還沒有學!超綱了,我們等會講容斥的時候再說。
\(1\to n\) 個自然數中選出 \(k\) 個,使得他們互不相鄰的方案數?
答案是 \(\binom{n-k+1}{k}\) ,相當於是留了 \(k-1\) 個空加在每兩個被選擇的位置中間。
證明:
從組合意義上來說容易證明。因為你 \(n\) 中拿 \(m\) 個等價於有 \(n-m\) 個不拿。
證明:
從組合意義來證明。
我們把 \((x+y)^n\) 看作是有 \(n\) 個 \((x+y)\) 相乘,那麼得到一個 \(x^ay^{n-a}\) 相當於是從 \(n\) 個 \((x+y)\) 中選出 \(a\) 個 \((x+y)\) 中的 \(x\) 相乘,那麼結果的多項式中就有一項是 \(\binom{n}{a}x^ay^{n-a}\) 。所以的這種項都滿足這種情況,那麼公式可得。
Q.E.D.
其實不一定要求必須是兩元的,多元的也是同理。
然後我們可以得到多項式定理:
證明:
同二項式定理證明,對於 \(x_1^{n_1}x_2^{n_2}...x_m^{n_m}\) 這一項的係數為 \(\binom{n}{n_1}\binom{n-n_1}{n_2}...\binom{n-n_1-n_2-...-n_{m-1}}{n_m}\) 。
展開發現可以抵消一些東西,於是上面的係數就等於:
Q.E.D.
帕斯卡定理,你也可以說是楊輝三角。我們知道 \((x+y)^n\) 得到的多項式是係數滿足楊輝三角的,我們知道了二項式定理的話,發現這個東西實際上是組合數,所以實際上是組合數的同層展開是滿足楊輝三角的。但是證明的話顯然不能這麼證明。
證明:
我們一個數一個數看這個數是否選取,假設現在已經看了 \(n-1\) 個數,選了 \(x\) 個數。我們考慮如果得到 \(\binom{n}{k}\)
那麼接下來這個數選或不選分別造成 \(1\) 和 \(0\) 的貢獻,也就是說:
如果接下來這個數選,那麼只有 \(x=k-1\) 的情況符合條件。否則只有 \(x=k\) 的情況符合條件。於是加法原理把兩種情況的方案數加起來即可。
Q.E.D.
實際上是 \((1+1)^n\) ,當然也可以從組合意義上證明。
實際上是 \((1-1)^n\) ,我稱之為第一類二項式反演。
按定義來就沒了,簡單提一下。
定義展開左邊上下分子分母同乘 \((n-k)!\) 即可證明。
證明:
Q.E.D.
證明和上面差不多,就不證了。其實你想拆可以一直這麼拆。
證明:
採用組合分析。
指定 \(n+1\) 個數的集合 \(S=\{a_1,a_2,...,a_{n+1}\}\)
先考慮右邊的組合意義,即從 \(n+1\) 個數中選出 \(k+1\) 個。
左邊的組合意義:相當於是總共 \(n+1\) 種不累加的情況的加法原理。
第一種:在指定必須選擇 \(a_1\) ,然後從剩餘的 \(n\) 個數中選擇 \(k\) 個,方案數 \(\binom{n}{k}\)
第二種:在指定必須不選擇 \(a_1\) 而選擇 \(a_2\) ,然後從剩餘的 \(n-1\) 個數中選擇 \(k\) 個,方案數 \(\binom{n-1}{k}\)
第三種:在指定必須不選擇 \(a_1,a_2\) 而選擇 \(a_3\) ,然後從剩餘的 \(n-2\) 個數中選擇 \(k\) 個,方案數 \(\binom{n-2}{k}\)
第 \(n+1\) 種:在指定必須不選擇 \(a_1,a_2,...,a_n\) 而選擇 \(a_{n+1}\) ,然後從剩餘的 \(0\) 個數中選擇 \(k\) 個,方案數 \(\binom{0}{k}\)
總體的組合意義 \(\sum_{i=0}^n{\binom{i}{k} }\) 等價於從 \(n+1\) 個數中選出 \(k+1\) 個,那麼等式左右兩邊組合意義相同,等式成立。
Q.E.D.
證明:
指定集合 \(A=\{a_1,a_2,...,a_m\}\) 和 \(B=\{b_1,b_2,...,b_n\}\)。
右邊問題等價於從 \(A,B\) 兩個集合中選出 \(r\) 個的方案數。
左邊問題等價於:
對於 \(k\in [0,r]\),先在 \(A\) 中先取出 \(k\) 個,然後在 \(B\) 中選出 \(r-k\) 個的總方案數。
即 \(A,B\) 中總共選出 \(r\) 個的方案數。
所以左右兩個問題組合意義等價,等式成立。
Q.E.D.
證明:
已知:\(g(n)=\sum_{i=0}^n(-1)^i\binom{n}{i}f(i)\)
則:
Q.E.D.
然後我們還可以得到一個擴充套件:
證明:
令 \(G(n)=(-1)^ng(n)\) ,有:
若 \(f(n)=\sum_{i=0}^n(-1)^i\binom{n}{i}G(i)\) 成立,有 \(G(n)=\sum_{i=0}^n(-1)^i\binom{n}{i}f(i)\)
即
當 \(n\) 為偶數,則 \(n-i\) 與 \(i\) 奇偶性相同,有 \(g(n)=\sum_{i=0}^n(-1)^{n-i}\binom{n}{i}f(i)\)
當 \(n\) 為奇數,則 \(n-i\) 與 \(i\) 奇偶性相反,同樣有 \(g(n)=\sum_{i=0}^n(-1)^{n-i}\binom{n}{i}f(i)\)
由此有 \(g(n)=\sum_{i=0}^n(-1)^{n-i}\binom{n}{i}f(i)\)
Q.E.D.
考慮 \(n\) 個人圍成圓的圓排列方案數為 \(Q^n_n\) 。我們發現對於一個圓,從每個地方斷開都可以形成一個新的排列,所以:
\(Q_n^n\times n=A^n_n\Rightarrow Q^n_n=\frac{Q^n_n}{n}=(n-1)!\)
所以 \(Q^m_n=\frac{A^m_n}{m}=\frac{n!}{r(n-r)!}\)
設 \(f(n)\) 表示將 \(n\) 個編號為 \(1,2,...,n\) 的物品,放到編號為 \(1,2,...,n\) 的位置中,使每個物品放置的位置的編號與物品的編號都相同的方案數。
我們考慮遞推,考慮目前放置第 \(n\) 個物品,先暫時放在第 \(n\) 個位置,而保證其他 \(n-1\) 個物品都放在 \([1,n-1]\) 的位置。然後考慮前面的一個物品和第 \(n\) 號物品交換位置,可知 \(f(n)\) 只能由兩種情況遞推而來。
第一種情況:前面的 \(n-1\) 個物品全部錯位。這個直接就是每個物品都可以換。總共 \(n-1\) 種交換方法。
第二種情況:前面 \(n-1\) 箇中除一個物品外全部錯位。\(n\) 必然與這個不錯位的物品換位,這個不錯位物品有 \(n-1\) 種可能。
那麼可得遞推式:
假設有 \(n+1\) 個物品,那麼將物品分為 \(n\) 組後,至少有一組含有兩個及以上的物品。
證明:
假設每個分組都只有至多 \(1\) 個物品,那麼最多有 \(n\) 個物品,與有 \(n+1\) 個物品的事實矛盾。
由此得證。Q.E.D.
一個擴充套件:
將 \(n\) 個物品分為 \(k\) 組,至少存在一個分組含有大於等於 \(\lceil\frac{n}{k}\rceil\) 個物品。
同樣可以反證,簡單就不證了。
有一個集合的集合 \(A=\{S_i\}\) ,那麼:
證明:
如果對於每個元素都保證其出現一次,那麼上式正確。
現在考慮對於一個元素 \(x\) ,證明其出現次數為 \(1\) 。假設它在集合 \(T_1,T_2,...,T_k\) 中出現。
那麼其出現次數為:
可知出現次數為 \(1\) 。Q.E.D.
右邊容斥計算即可。
對於兩個關於集合的函數 \(f(S),g(S)\) ,如果:
那麼有:
證明:
我們知道,對於一個關於集合的函數 \(F(P)=\sum_{T \subseteq (P)} (-1)^{|P|-|T|}\),有:
那麼我們就有:
Q.E.D.
還有一個倒過來的推論(補集形式)
如果:
那麼有:
對於 \(n\) 長全序序列 \(\{x_i\}\) ,\(S=\{1,2,...,n\}\),有:
證明:
由於全序的對稱性,我們可以知道 \(min\) 和 \(max\) 互換的話,效果也是一樣的,所以我們只考慮證明第一個式子。
考慮構造一個係數 \(a_i\),滿足:
那麼:
解釋一下,這裡是對於每個元素統計其貢獻,對於第 \(i\) 大的數,我們可以知道其在所處集合作為最小值的集合的大小小於等於 \(i\) 。然後我們可以列舉集合的大小,顯然比這個數大的有 \(i-1\) 個,我們從中再選出 \(j-1\) 個和當前這個陣列成集合,那麼上式可得。
然後我們知道,當 \(\sum_{j=1}^ia_j\binom{i-1}{j-1}=[i=k]\) 時,則構造成立。
令 \(g(n)=[n+1=k],f(n)=a_{n+1}\) 那麼:
由二項式反演:
因此:
Q.E.D.
其實 min_max 容斥
在期望意義下也滿足:
由期望線性性可知。
我們前面提到過這個問題是需要容斥原理的。現在我們已經可以解決這個問題了。
回顧一下問題:一個多重集合 \(S=\{a_1\cdot n_1,a_1\cdot n_2,...,a_k\cdot n_k\}\) 的組合數,就是從中選出 \(r\) 個,得到不同可重集的方案數。每個數被選出 \(x_i\) 個。
設一個集合 \(S_i\) 表示不滿足 \(x_i\le n_i\) ,即滿足 \(x_i\ge n_i+1\) 的集合。
那麼答案為:
後面那半部分我們容斥計算:
意義就是提前為其留出一些空間使其滿足條件。
那麼:
那麼就可以切掉這個題了
但是這個題還有一個小技巧。
發現範圍巨大,不好直接算組合數,但是 \(n\) 很小,我們把組合的求和轉換為與 \(n\) 相關的演演算法。具體轉換類似下方的做法。
卡特蘭數 \(Cat_n\) ,是下問題的答案:從 \((0,0)\) 出發,可以按照向量 \((1,0)\) 和 \((0,1)\) 遊走,不越過(可以碰到)第一象限角平分線的情況下,到達 \((n,n)\) 的方案數。(就是隻能在這條線下方走)
我們通過解決這個問題可得到卡特蘭數的公式。
不越過第一象限角平分線 \(y=x\) ,等價於不觸碰 \(y=x+1\) 。
然後你發現如果你碰到了直線 \(y=x+1\) ,那麼可以發現從這個觸碰點到 \((n,n)\) 的方案數和到 \((n-1,n+1)\) (\((n,n)\) 關於 \(y=x+1\) 的對稱點)的方案數相同,因為在兩邊走是對稱的。然後我們知道到達 \((n-1,n+1)\) 必然經過 \(y=x+1\) ,所以只需要到達 \((n,n)\) 的方案數減去到達 \((n-1,n+1)\) 的方案數即可。
即 \(Cat_n=\binom{2n}{n}-\binom{2n}{n-1}\)
然後初始狀態 \(Cat_0=Cat_1=1\)
證明:
對於 \(2n\) 長的括號序列,如果最後一個右括號與第 \(i\) 個左括號匹配,那麼前 \((i-1)\) 個左括號的匹配肯定構成一個合法括號序列。這個 \(i\) 滿足 \(1\le i\le n\) 。那麼公式可得。
Q.E.D.
我們發現其實對於所有的可以轉化為如下問題的問題,都可以考慮卡特蘭數列:
長度為 \(2n\) 的合法括號序列計數。
這個問題可以抽象上座標軸,即從 \((0,0)\) 通過向量 \((1,1)\) 和 \((-1,-1)\) 到達 \((2n,0)\) 且不越過 \(x\) 軸。這個和我們上面的那個問題是等價的,通過關於 \(y=-1\) 對稱可以得到相同的答案。
當然,如果遇到等價於我們最初提到的問題的問題,那麼也是可以考慮卡特蘭數列的。
我們看一些例子來判斷一下:
1.有 \(2n\) 個人排成一行進入劇場。入場費 \(5\) 元。其中只有 \(n\) 個人有一張 \(5\) 元鈔票,另外 \(n\) 人只有 \(10\) 元鈔票,劇院無其它鈔票,問有多少種方法使得只要有 \(10\) 元的人買票,售票處就有 \(5\) 元的鈔票找零?
每有一個有 \(5\) 元的人進來,就多可以接一個 \(10\) 元的人,分別抽象成左右括號,那麼符合卡特蘭數列。
2.一個棧,加入順序為 \(1,2,...,n\) ,問合法出棧順序的方案數。
左右括號分別代表入棧和出棧,符合卡特蘭數列。
3.\(n\) 個節點,可以構成多少不同的二元樹?
假設 \(n\) 個節點的答案為 \(h(n)\)
於是我們每次固定根節點,有 \(h(n)=\sum_{i=1}^{n}h(i-1)h(n-i)\)
滿足遞迴公式,符合卡特蘭數列。
4.在圓上選擇 \(2n\) 個點,求將這些點成對連線起來使得所得到的 \(n\) 條線段不相交的方案數。
選擇兩個點後其他點被分為兩個部分,兩邊相互獨立可以分治進行,滿足遞迴公式,符合卡特蘭數列。
5.對角線不相交的情況下,求將一個凸 \(2n\) 邊形區域分成三角形區域的方案數。
這個和 \(4\) 的本質相同,就不再贅述。
例題1
直接上公式就過了。
例題2
分析一下可以發現是卡特蘭數列。我們可以發現一個結論,在奇數位放置一個數,那麼它之前的數都小於它,它之後的數都大於他。然後可以分治處理,且當只有一個奇數位時,方案只有一個,因此滿足卡特蘭數列。
然後考慮怎麼求這個卡特蘭數,由於模數隨機,我們不能逆元,遞推公式就用不了了。
遞迴公式複雜度是 \(O(n^2)\) 的,顯然不行。
那麼只能考慮用通項公式求解。
把上下兩個數約分一下。具體是把分子分母拆成乘法形式,開陣列打個標記表示有多少個這個因數,然後它這些因數繼續拆成質因數,最後統一計算每個係數即可。因為卡特蘭數必定是整數,因此不用擔心約分約不乾淨的情況。
這個可以增長一下經驗,放個程式碼:
int n,mods;
inline int inc(int x,int y){
return (x+=y)>=mods?x-mods:x;
}
inline int dec(int x,int y){
return (x-=y)<0?x+mods:x;
}
inline int mul(int x,int y){
return 1ll*x*y%mods;
}
const int N=1e6+3;
int smallest[2*N];
std::vector<int>pri;
inline void Euler(){
smallest[1]=1;
for(int i=2;i<=2*n;++i){
if(!smallest[i]){
pri.push_back(i);
smallest[i]=i;
}
for(auto it:pri){
if(it*i>2*n) break;
smallest[i*it]=it;
if(i%it==0){
break;
}
}
}
}
int cnt[2*N];
inline int qpow(int a,int b){
int ans=1;
while(b){
if(b&1) ans=mul(ans,a);
a=mul(a,a);
b>>=1;
}
return ans;
}
int main(){
filein(a);fileot(a);
read(n,mods);
for(int i=1;i<=n;++i)
cnt[i]-=1;//分子
for(int i=n+2;i<=2*n;++i)
cnt[i]+=1;//分母
Euler();
for(int i=2*n;i>1;--i){
if(smallest[i]<i){
cnt[smallest[i] ]+=cnt[i];
cnt[i/smallest[i] ]+=cnt[i];
}
}
int ans=1;
for(int i=2;i<=2*n;++i){
if(cnt[i] and smallest[i]==i)
ans=mul(ans,qpow(i,cnt[i]) );
}
printf("%d\n",ans);
return 0;
}
記作 \(\begin{Bmatrix} n \\ k \end{Bmatrix}\) ,或者 \(s_2(n,k)\) 。表示 \(n\) 個兩兩不同的元素劃分為 \(k\) 個互不區分的非空子集的方案數。
初始狀態 \(\begin{Bmatrix} n \\ 0 \end{Bmatrix}=[n=0]\) 。
證明:
考慮新加入一個元素。
如果這個元素放在已經存在的非空子集中,有 \(k\begin{Bmatrix} n-1 \\ k \end{Bmatrix}\) 種方案。
如果這個元素單獨新開一個非空子集,有 \(\begin{Bmatrix} n-1 \\ k-1 \end{Bmatrix}\) 種方案。
然後加法原理合並可得。Q.E.D.
證明:
設 \(g(i)\) 為將 \(n\) 個不同元素放入 \(i\) 個不同集合中(可以為空集)的方案數,\(f(i)\) 為將 \(n\) 個不同元素放入 \(i\) 個不同集合(不可為空集)的方案數。
那麼
第二個式子成立,是因為集合互不相同,先列舉啟用幾個集合,再列舉選擇具體用哪些集合。
通過二項式反演:
於是有
發現是一個折積的形式,\(f(x)=\sum_{i=0}^n\frac{(-1)^i}{i!}x^i\) 折積 \(g(x)=\sum_{i=0}^n\frac{i^n}{i!}\) 即可 \(O(n\log n)\) 的時間內求出。
記作 \(\begin{bmatrix} n \\ k \end{bmatrix}\) 或 \(s(n,k)\) 。表示 \(n\) 個不同的元素劃分為 \(k\) 個不同的非空輪換的方案數。
什麼叫做輪換?相等於一個首尾相接的環。也就是說,對於輪換 \([A,B,C]\) ,其滿足 \([A,B,C]=[C,A,B]=[B,C,A]\)。
初始狀態 \(\begin{bmatrix} n \\ k \end{bmatrix}=[n=0]\)
證明:
還是考慮新加入一個元素。
如果單獨開一個輪換,那麼有方案數 \(\begin{bmatrix} n-1 \\ k-1 \end{bmatrix}\) 種。
如果加入一個已經存在的輪換,那麼可以考慮加在已經存在的數後面,有 \((n-1)\begin{bmatrix} n-1 \\ k \end{bmatrix}\) 種方案數。然後加法原理合並即可。
Q.E.D.
然後似乎沒有什麼好用的通項公式?
上升冪 \(x^{\overline{n}}=\prod_{i=0}^{n-1}(x+i)\)
下降冪 \(x^{\underline{n}}=\frac{x!}{(x-n)!}=\prod_{i=0}^{n-1}(x-i)\)
證明:
考慮歸納證明:
\(n=0\) 時,等式兩邊皆為 \(1\),等式成立
\(n=1\) 時,等式左邊等於 \(x\) ,等式右邊等於 \(x\) ,等式成立。
Q.E.D.
衍生公式:
由上式加上斯特林反演得
證明:
同樣考慮歸納證明:
\(n=0\) 時,等式兩邊皆為 \(1\) ,等式成立
\(n=1\) 時,等式兩邊皆為 \(x\) ,等式成立
Q.E.D.
衍生公式:
同樣是由上式加上斯特林反演得
其實這個式子也可以不用斯特林反演,我們直接按照組合意義來證明。
證明:
這是因為 \(m^n\) 的組合意義是將 \(n\) 個有區別的數放入 \(m\) 個有區別的集合,允許空集的方案數。上式子相當於先列舉盒子的個數,再列舉盒子的區別,再從 \(m\) 個集合中選出 \(i\) 個,然後再數放入。
當我們用這個來證明反演:
這裡列舉範圍可以取 \(n\) 的原因是我們認為 \(i\) 大於 \(n\) 時,式子值為 \(0\)。
而大於 \(x\) 的部分,\(\binom{x}{i}\) 取 \(0\) ,因此得到此式。
Q.E.D.
一個小小結論,按上面兩個式子拆解易證:
反轉公式(1)證明:
Q.E.D.
反轉公式(2)證明:
Q.E.D.
上式中一二類斯特林數可以互換位置。
證明:
已知: \(g(n)=\sum_{i=0}^n(-1)^{n-i}\begin{bmatrix} n \\ i \end{bmatrix}f(i)\)
Q.E.D.