又臨近期末了,沒什麼時間刷題。就忙裡偷閒,看了看布魯迪的《組合數學》,先看了計數部分,圖的部分寒假再說吧。學的倉促,理解也比較膚淺,這裡先記下各種有用的公式定理和經典的證明方法,以及一點總結歸納。
1. 鴿巢原理
鴿巢原理的內容就不說了,很簡單,但它的應用卻有著讓人意想不到的功力。
幾個例子:
1. 證明:在序列a1,a2,...,am中存在連續個a,這些a的和能被m整除。
如果枚舉所有連續和,那麼演算法複雜度應該是O(n2)。但不管怎樣,這種連續和的題都先預先處理出從頭到第i項的和sum[i]是沒錯的。假設這些和模m都有一個非零且不同的餘數(如果是0或相同那就不用證明了),由於這些餘數最多有m-1個,而m>m-1,所以根據鴿巢原理,一定存在sum[i]=sum[j],於是問題得證。
2. (改編)sy大濕計劃用11周時間刷poj上的數學題,他決定每天至少做一道題,但為了不使自己過於疲勞,他決定每周不超過12道題。證明存在連續若干天,期間他恰好刷了21道題。
類似上一道題,都是利用給定一個序列,且已知它有多少種不同的數(或範圍),再構造出大於這個範圍的數目,這樣就可以利用鴿巢原理了。證明略
3. 從整數1,2,...,200中選出101的整數。證明:所選的整數中存在這樣的兩個整數,其中一個可以被另一個整除。
這個證明最精彩的地方在:任意整數都可以寫成a*2k(k次方)的形式,其中k>=0,且a是奇數.有了這個後,我們把選的101個數都表示成這種形式,假定a都是不同的,且k也不同(相同就能整除了),由於a只有100種選擇,而選了101個數,所以一定有兩個a是相同的。
4. 確定一個整數m,使得如果在邊長為1的等邊三角形內選任意m個點,則存在2個點,它們距離至多為1/n。
答案:n*n+1
鴿巢原理加強形式:
令q1,q2, q3, ...., qn為正整數。如果將 q1,q2, q3, ...., qn - n + 1 個物體放到n個盒子中,則存在一個i,使得第i個盒子至少含有qi個物品。
舉一道典型題目:
一個袋子裝了100個蘋果,100個香蕉,100個橘子,100個梨子。如果我們每分鐘從袋子裡取出1種水果,那麼需要多少時間我就能肯定至少已經拿出1打相同種類的水果。
答案:(12-1)*4+1
2. 排列與組合
一條經驗法則:讓最有約束性的選擇優先。
組合學中有一種強大的證明方法:“雙計數”技術。
減法原理:適用於,當對U和A補計數比對A計數容易。
n個元素集合的迴圈r-排列公式:
P(n,r)/ r = n! / r*(n-r)!
對於不能直接運用公式的時候,可以用把某個元素固定在一個位置的思想。
當然,更一般的方法是用polya計數,這個後面再談。
多重集排列公式:
n!/ n1!*n2!*...*nk!
多重集組合公式:
C(r+k-1,r)
3. 二項式係數
Pascal公式:
C(n,k) = C(n-1,k)+ C(n-1,k-1)
二項式係數遞推式:
a[k+1] = a[k] * (n-k) / (k+1);
一些恒等式:
k*C(n,k) = n * (n-1,k-1)
(0~n)∑C(n,k)* C(n,k) = C(2n,n)
廣義二項式,(廣義階乘)
。。。
二項式係數中的最大者:
C(n,下取整(n/2)) = C(n,上取整(n/2))
S是包含n的元素的集合,S的雜置就是S的組合的集合C,具有這樣的性質:C中沒有組合含義另一個組合。
|C|的最大值是C(n,下取整(n/2)),根據sperner定理。
應用:一個talk show節目主持人僅準備了10個笑話。每個晚上他都會講一些笑話,使你能夠收聽到從未在此之前的晚上至少全部播放過的笑話,求這樣的晚上最大能有多少?
多項式係數:
C(n,k1,k2,...,kt) = n!/ k1! * k2! *...*kt!
4. 容斥原理
集合S不具有性質P1,P2,...,Pm的物體的個數:
_ _ _
|A1∩A2∩...∩Am| = |S|-∑|Ai|+∑|Ai∩Aj|+...+(-1)m|A1∩A2∩...∩Am|
至少具有性質P1,P2,...,Pm之一的集合S的物體的個數:
|A1∪A2∪...∪Am| = ∑|Ai| - ∑|Ai ∩ Aj| + ...+(-1)m+1|A1∩A2∩...∩Am|
下面舉一些容斥原理的應用
1.求滿足 1<=x1<=5 ,-2<=x2<=4,0<=x3<=5,3<=x4<=9
的方程 x1+x2+x3+x4=18 整數解的個數
原問題等價為0<=y1<=4,0<=y2<=6,0<=y3<=5,0<=y4<=6
y1+y2+y3+y4=16的解的個數
令P1為y1>=5,P2為y2>=7,P3為y3>=6,P4為y4>=7
S是所有方程非負整數解的集合,令Ai表示S的滿足性質Pi(i=1,2,3,4)的解組成的子集
然後套用容斥原理就可以了。
2.錯位排列
錯位排列的定義就不解釋了,可以看題目就能明白
公式:
Dn = n!(1-1/1!+1/2!-1/3!+...+(-1)n*1/n!)
5. 產生函數
產生函數(母函數)很適合求解計數問題。因為,
一方面,產生函數可以看成是代數對象,其形式上的處理使得人們可以通過代數手段計算一個問題的可能性數目;
另一方面,產生函數是無限可微分函數的泰勒級數。如果能夠找到函數和它的泰勒級數,那麼泰勒級數的係數則給出問題的解。
產生函數以非常緊湊的形式將無窮序列的資訊濃縮於自身。
母函數計數的精華思想,還是舉例說明比較清楚。
問題描述:確定可以由蘋果、香蕉、橘子和梨袋裝水果的袋數Hn,其中在每個袋子中蘋果數是偶數,香蕉數是5的倍數,橘子數最多是4個,而梨的個數為0或1
g(x) = (1+x2+x4+...)(1+x5+x10+...)(1+x+x2+x3+x4)(1+x)
= (1/1-x2)(1/1-x5)(1-x5/1-x)(1+x)
= 1/1-x2
= ∑C(n+1,n)Xn
所以,Hn = n+1
這裡用到了一個很重要的公式(M67稱它為核武器):g(x) = 1 / 1 - xk = ∑C(n+k-1,n)Xn;
因為我們平常即使求出了母函數,也不容易直接得到它寫成求和形式的運算式(這樣才能得到所需的係數),而對於上面那種特殊情況,卻有這麼的一個公式,可以方便的得到係數
對於母函數在acm做題中的應用,要和FFT(快速傅裡葉變換)結合起來,後者可以快速的計算多項式乘法。
6. Catalan數&&格路徑
定理:n個+1和n個-1構成的2n項,a1,a2,...,a2n
其部分和滿足a1+a2+...+ak >= 0(1<= k <= 2n)
的數列的個數等於第n個Catalan數
Xn = C(2n,n) / n+1
這個定理的經典之處在於構造出了+1,-1的抽象模型,從而為各種Catalan數應用的題目提供了模型
兩例經典應用:
1.有2n個人排成一行進入劇場。入場費5元每人。但現在2n個人中,n個人持有5元,n個人持有10元,且售票處開始時沒有錢。問有多少種排隊方式使得每個人都保證有錢找(或者不用找)?
把持有10元的人看做+1;5元的-1
2.在一個n*n的地圖上,一個人從他家(0,0)到辦公室(n,n)走2n步,且不穿過家到辦公室的對角線(可以碰到!),有多少種走法?
求出在對角線上面的路線*2
用+1標誌北;-1標誌東。
這類問題有更一般的形式,下面我們來進行討論
問題描述如下:考慮一個具有整數座標的座標平面中點的整格,
從(0,0)走到(m,n),用水平步進,垂直步進,(對角步進),有多少種走法(不能往回走,往回走的需要另外的解法,這裡就不討論了)
1. 無限制的情況
C(m+n,m)
2.下對角線格路徑
這裡用到了一個很經典的等價轉化。先想到的是用減法原理,求穿過對角線的格路徑數。怎麼求呢?考慮把一條從(0,0)穿過對角線到達(m,n)的路徑向下平移一個單位,得到的是一條,從(-1,0)到
(m-1,n)的依然穿過(也可能變成接觸)對角線的路徑。光有這個還看不出來什麼方便,因為算從(-1,0)到(m-1,n)的路徑數依然不好算,那我們接著轉化。把平移後的每條路徑,從(-1,0),到該路徑與對角線的第一個接觸點d,這一段,再沿著對角線反射,從而得到一條(0,-1)到
(m-1,n)的路徑。這條路徑與題設開始要求的那條路徑一一對應,且這中情況下的路徑數就好算了,就是無限制下的
C(m+n,m-1),所以最終答案為
C(m+n,m)*(m-n+1)/m+1,在m=n的情況下也符合Catalan數