加法原理是分類計數原理,常用於排列組合中,具體是指:做一件事情,完成它有n類方式,第一類方式有m1種方法,第二類方式有m2種方法,……,第n類方式有mn種方法,那麼完成這件事情共有m1+m2+……+mn種方法。
做一件事,完成它需要分成n個步驟,做第一 步有m1種不同的方法,做第二步有m2種不同的方法,……,做第n步有mn種不同的方法。那麼完成這件事共有 n=m1×m2×m3×…×mn 種不同的方法。
這個題因為和dp結合,狀態設計比較難想。但是當我們用\(f[i][j][k]\)來表示到第i行,其中j列擺放了乙個棋子,k列擺放了兩個棋子之後,我們不難發現狀態的轉移就是其實就是加法原理和乘法原理的應用:
以下是核心**:
dp[i][j][k]=(dp[i][j][k]+dp[i-1][j][k])%mod;
//這一行什麼都不放
dp[i][j-1][k+1]=(dp[i][j-1][k+1]+j*dp[i-1][j][k])%mod;
//這一行在原先只有乙個棋子的那一列放乙個棋子
dp[i][j+1][k]=(dp[i][j+1][k]+(m-k-j)*dp[i-1][j][k])%mod;
//這一行在原先沒有棋子的那一列放乙個棋子
dp[i][j+2][k]=(dp[i][j+2][k]+(m-k-j)*(m-k-j-1)/2*dp[i-1][j][k])%mod;
//這一行在原先沒有棋子的兩列分別擺放乙個棋子
dp[i][j][k+1]=(dp[i][j][k+1]+(m-k-j)*dp[i-1][j][k]*j)%mod;
//這一行在原先有乙個棋子和沒有棋子的兩列分別放乙個
dp[i][j-2][k+2]=(dp[i][j-2][k+2]+j*(j-1)/2*dp[i-1][j][k])%mod;
//這一行在原先有乙個棋子的兩列分別擺放乙個棋子
乙個與分類有關,乙個與分步有關;加法原理是 「分類完成」,乘法原理是 「分步完成」。
從\(n\)個不同元素中,任取\(m\)(m<=n,m與n均為自然數, 下同)個元素按照一定的順序排成一列,叫做從\(n\)個不同元素中取出\(m\)個元素的乙個排列;從\(n\)個不同元素中取出\(m\)(\(m<=n\))個元素的所有排列的個數,叫做從\(n\)個不同元素中取\(m\)個元素的排列數,用符號\(a_n^m\) 表示。
\(a_n^m=\frac\)
1、全排列問題
\(a_n^n=n(n-1)(n-2)...3\times 2\times 1=n!\)
2、部分排列
就是上面的計算公式qwq
\(n\)個人中選\(m\)(\(m<=n\)) 個出來,不排隊,不在乎順序就是\(c_n^m\)。
它和排列有關係為:\(c_n^m\times a_m^m=c_n^m\times m!=a_m^n\)
(解釋:因為要考慮順序,選出來的那m個人還需要全排列)
1、\(c_m^n=\frac\)
2、\(c_m^n=c_m^\)
3、\(c_m^n=c_^n+c_^\)
4、\(c_m^=\frac\times (m-n)}\)
5、\(c_^+c_^+c_^+...+c_^=2^\)
\(∵c_^=\frac\)
\(∵c_^=\frac\)
\(∴c_^=\frac=\frac\)
\(∵c_^=\frac=\frac\)
\(∴c_^+c_^\)
\(=\frac+\frac\)
\(=\frac\)
\(=c_m^n\)
假設現在有n個元素,對於第一類元素\(n_1\),有sum1個重複,第二類元素\(n_2\),有sum2個重複......第m類元素\(n_m\),有summ個重複,總方案數為:
\[\frac
\]附上一張來自wikipedia的圖幫助理解:
上面講解的是有限的可重複元素排列問題,下面講無限的可重複元素排列問題(就是每個元素都可以用無限多次參與排列)
現在我們從m個元素中選擇k個元素的,然後我們將這k個元素進行排序之後應該是這個樣子:(設我們選擇的數為編號為\(a_i\)
\(1<=a_1<=a_2<=......<=a_k<=m\)
那麼現在我們將等於號消去:
\(1<=a_1<=a_2+1<=a_3+2<=......<=a_k+k-1<=m+k-1\)
現在我們設\(b_i=a_i+i-1\),那麼很容易我們可以發現
\(1<=b_1
那麼現在問題就轉換成了在\([1,n+k-1]\)中選擇k個不重複的元素了,那麼根據我們的組合公式,自然是\(c_^k\)了qwq
同理還有求編號在1~n的元素中取k個元素,使得他們的編號不相鄰。公式是一樣的,證明也是一樣的。
這裡有一張來自wikipedia的圖,我覺得特別棒
二項式的係數公式:
\((x+y)^n=c_n^0x^ny^0+c_n^1x^y^1+......+c_n^nx^0y^n\)
(可以看到,其實也可以用楊輝三角表示)
綜合起來就是
\((x+y)^n=\sum_^n\times c_n^k\times x^\times y^k\)
錯排就是諸如有1~n n個人,每個人按照1~n進行編號,現在要讓他們排成一隊,但是每個人不能在自己編號上的問題。
對於這個問題,luogu**已經有專門的一期來進行詳細的講解~~
傳送門——戳我~~
錯排的遞推公式:
\(dp[1]=0\)
\(dp[2]=1\)
\(dp[i]=(n-1)(dp[i-1]+dp[i-2])\)
從n個不同元素中不重複地取出m(1≤m≤n)個元素在乙個圓周上,叫做這n個不同元素的圓排列。如果乙個m-圓排列旋轉可以得到另乙個m-圓排列,則認為這兩個圓排列相同。
n個不同元素的m-圓排列個數n為:
\(a_n^m/m=\frac\)
特別地,當m=n時,n個不同元素作成的圓排列總數n為: \(n=(n-1)!\)
現在乙個環被分成了n段,要求每一段上都塗上顏色。一共有k種不同的顏色,塗好之後兩兩相鄰顏色不能相同。問有多少種塗色方案?
這個問題我們可以這樣考慮:
第一種情況:如果我們把原先的環看作只有\(n-1\)段,進行塗色,那麼就是子問題\(a_\),而且因為現在兩兩相鄰的一定顏色不同,所以這時候我們再新增乙個的話就是乘上\(m-2\);
第二種情況:我們把原先的環看作\(n-2\)段,,這樣的話轉換成了\(a_\)的子問題,然後我們隨意將一段分為兩段,這時候還差一段,在兩個相同顏色中間插入一種顏色,自然是有\(m-1\)種選擇方法。
遞推公式整理如下:
\(a_n=(m-2)a_+(m-1)a_\)
這是乙個二階常係數遞推式,推導之後通項公式如下:
\(a_n=(m-1)^n+(-1)^n\times (m-1)\)
1、如果p是質數而且比較小\((<=10^5)\),可以使用lucas定理
2、如果\(n,m<=10^6,p<=10^9\) 可以先預處理出來逆元,然後直接算qwq
\(c_n^i+c_^i+...+c_^i=c_^-c_^\)
具體就是可以把右邊的那個減數轉移到左邊來。。其他的合併很直觀了qwq
一些簡單的排列組合問題
排列及計算公式 從n個不同元素中,任取m m n 個元素按照一定的順序排成一列,叫做從n個不同元素中取出m個元素的乙個排列 從n個不同元素中取出m m n 個元素的所有排列的個數,叫做從n個不同元素中取出m個元素的排列數,用符號 a n,m 表示或 p n,m 表示。a n,m n n 1 n 2 ...
圍成一圈的排列組合問題 排列組合問題
曾經的好朋友關係不錯,有一天那個女孩對那個男孩說了喜歡 那個男孩就不在聯絡這個女孩了 這個女孩就是很喜歡他 那個男孩去當兵了 那個女孩要等他 不強求做男女朋友 兩年後女孩去找他 他會理這個女孩嗎?他不會理這個女孩的 追問 為什麼 回答 那個男孩就不在聯絡這個女孩了,證明男孩不喜歡女孩 追問 但關係很...
排列組合問題
若有一串字母abc,進行全排列,有六種方法,3的階層,321,為什麼是這樣呢,我們根據 看思路 這之間會涉及遞迴,回溯 將abc看成陣列,a 0 a,a 1 b,a 2 c 下文中用a0代替a,a1代替b,a2代替c 排列的過程就是交換位置的過程 1 先對a進行交換 即k 0時 a0和a0自己交換 ...