加法原理
今天您想給orz做一道題。
您有10道數學題,5道物理題,5道oi題,這些題orz都不會做。
可惜您只能用其中一道題來考orz. 請問您有多少種方法讓orz爆零?
10+5+5 = 20
假設您有很多種手段,使用每種手段都可以達成目標。
那么:每種手段的方法數之和,就是達成目標的方法數。

乘法原理
今天您想給orz做三道題:數學、物理、oi各一題。
您有10道數學題,5道物理題,5道oi題,這些題orz都不會做。
您只能在每個科目選一道題來考orz.需要讓orz三道題都不會。
請問您有多少種方法讓orz爆零?
10*5*5=250
如果您為了達成目標,需要幾個步驟,所有的步驟都需要完成,目標才能達成。
那么完成目標的方法數是:各步驟方法數的乘積。

排列與組合




我們再考慮另一個問題:
有甲乙丙丁戊共5個神仙,你要從中選出三個神仙排成一排。
有多少種方法?
第一位:5種
第二位:4種
第三位:3種



記為
=n!/(n-m)!
排列數
從5個女生和7個男生中,選出3個女生和3個男生排成一排。 女生站在一起,男生站在一起,且女生排在男生前面。
有多少種方法?

現在我們考慮另一個問題。
放鴿子:一共有3只鴿子,你要從中選出2只放飛。不關心選擇的順序,只關心選了哪些鴿子。





沒有發現這個柿子,表示的就是楊輝三角?
0 1 2 3 4
C0: 1
C1: 1 1
C2: 1 2 1
C3: 1 3 3 1
C4: 1 4 6 4 1


遞推求組合數

其他排列組合




生成算法
現在已經存在很多種全排列算法,例如字典序算法、遞增進位制算法、遞減進位制算法、鄰位對換法。這里介紹一下圓排列生成的算法。我們不妨用1、2、...、n來表示n個元素
對於
,圓排列僅有一種。
對於
,假設我們已經得到了n-1時的圓排列,我們由此序列來生成n的圓排列。
假設
為n-1時的其中一個圓排列,那么我們可以將n分別插入到
后,由此生成新的n-1種排列
......
對
個圓排列均進行此操作,即可生成一組新的一組排列,此排列即為n時的圓排列。
算法證明
首先我們由上述算法能夠得到,對於n,我們生成的排列有
種排列。與圓排列的個數相等,下面我們只需要證明這
個排列無重復即可。首先我們由上述構造方法可知,
一定為每個圓排列的頭。
下用數學歸納法證明:
1. 對於n=1,2,3時,無重復成立。
2. 假設對於n-1時,無重復成立。
3. 對於n時:
由構造方式可知,n是采取插入的方式,故由
生成的n-1個序列中,n左右的兩個元素均不相同。故生成的n-1個序列兩兩不同。
下證由不同圓排列生成的序列無重復。因為
一定為每個圓排列的頭,所以若兩個序列重復,它們一定是完全相同的序列。(例如123 231 312為同一組圓排列,但是由於1一定為頭,所以不可能出現后兩種情況)
假設序列
與序列
重復,由上述可知:
我們去除n后得到n-1的圓排列序列,但是對於n-1,無重復序列,故矛盾。即對於n時生成的算法無重復。
即證。
舉例
把n個有標號的珠子排成一個圓圈,共有多少種不同的排法?
解:這是典型的圓排列問題。對於圍成圓圈的n個元素,同時按同一方向旋轉,即每個元素都向左(或向右)轉動一個位置,雖然元素的絕對位置發生了變化,但相對位置未變,即元素間的相鄰關系未變,這樣的圓排列認為是同一種,否則便是不同的圓排列。下面從三種角度推導圓排列數的計算公式。
方法一:
先令n個相異元素任意排成一行(稱為線排列),共有n!種排法,再將其首尾相接圍成一圈,當圓轉動一個角度時,對應另一個線排列,當每個元素又轉回到原先的位置時,相當於n個不同的線排列,故圓排列數為
方法二:
先取出某一個元素k,放於圓上某確定位置,再令余下的n-1個元素作成一個線排列,首尾置於k的兩側構成一個圓排列同樣可得到
方法三:
⊙x1x2…xk,⊙x2x3…xkx1,…,⊙xkx1…xk-1都表示同一環狀字,所以⊙x1x2…xk=⊙x2x3…xkx1=…=⊙xkx1…xk-1,有n個這樣的等式,其排列數為


實際上大家還應該注意到一點,就是有重復組合不考慮取出的元素的順序,通俗來說,你第一次取出一號元素第二次取出三號元素和你第一次取出三號元素第二次取出一號元素是一樣的情況;有了這點說明后可以進行證明了。可以把該過程看作是一個"放球模型";n個不同的元素看作是n個格子,去掉頭尾之后中間一共有(n-1)塊相同的隔板;用m個相同的小球代表取m次;則原問題可以簡化為將m個不加區別的小球放進n個格子里面,問有多少種放法;注意到格子的頭尾兩塊隔板無論什么情況下位置都是不變的,故去掉不用考慮;相當於m個相同的小球和(n-1)塊相同的隔板先進行全排列:一共有(m+n-1)!種排法,再由於m個小球和(n-1)塊隔板是分別不加以區分的,所以除以重復的情況:m!*(n-1)!;於是答案就是:(m+n-1)!/(m!*(n-1)!)=C(m,n+m-1)。
排列組合常用技巧
捆綁法
有8個講師,需要排成一排。zro和orz需要站在一起。(只需要站在一起,誰站在前面都行),有多少種方案?

隔板法
8個講師要站成一排,但是當局禁止zro和orz站在一起,問方案數。
我們考慮將剩下的6個講師先排成一排。於是出現了7個空位。
我們把zro和orz放在這7個空位里的2個就行了!


二項式定理






將這里的
視作當x=y=1時,(x+y)^10中x^10的系數,那么其余的也同理,所以上式=(1+1)^10=2^10=1024
【例 1】「NOIP2011」計算系數(信息學奧賽一本通 1648)
【題目描述】
給定一個多項式 (ax+by)k ,請求出多項式展開后 xnym (n+m=k)項的系數。
【輸入】
輸入共一行,包含 5個整數,分別為 a,b,k,n,m ,每兩個整數之間用一個空格隔開。
【輸出】
輸出共 1行,包含一個整數,表示所求的系數,這個系數可能很大,輸出對 10,007 取模后的結果。
【輸入樣例】
1 1 3 1 2
【輸出樣例】
3




求組合數的常規方法








組合(信息學奧賽一本通 1650)
【題目描述】
給出組合數 C(n,m) 表示從 n 個元素中選出 m 個元素的方案數。例如 C(5,2)=10,C(4,2)=6。可是當 n,m 比較大的時候,C(n,m) 很大。於是 xiaobo 希望你輸出 C(n,m) mod p 的值。 【輸入】
輸入數據第一行是一個正整數 T,表示數據組數; 接下來是 T 組數據,每組數據有 3個正整數 n,m,p。
【輸出】
對於每組數據,輸出一個正整數,表示 C(n,m) mod p 的結果。
【輸入樣例】
2
5 2 3
5 2 61
【輸出樣例】
1 10



中國剩余定理

其中m1,m2,m3...mk 為兩兩互質的整數求x的最小非負整數解.

現在已知一個數為C(n,m)=(M*t+x)%M 求x。M=m1*m2*…*mk, mi為質數

用中國剩余定理求得的最小非負整數解即為所求x。
例題:古代豬文
卡特蘭數
