雙射
單射 :不存在A中有兩個元素 和 B 中同一個元素對應
滿射 :B中每一個元素都在A中有對應的元素
單射 + 滿射 = 雙射
雙射一定滿足∣A∣=∣B∣
Lucas定理
Lucas定理是用來求c(n,m)modp的值.(p是素數)
表達式如下:
C(n,m)%p=C(n/p,m/p)∗C(n%p,m%p)%p
可遞歸實現,時間複雜度:O(plogp(n)),大致可認爲是O(plogn)
容斥的擴展公式
有集合 S1...Sn 求 ⋃i=1nSi
⋃i=1nSi=∑T∈S∣⋂i∈TSi∣∗(−1)∣T∣−1
小練習
n個整數變量xi滿足0≤xi≤ci
求x的和等於m的方案數
n∗m≤106
n≤20,m≤109
Min_Max容斥
有時max的期望非常不好算,但是min的期望很好算,那麼就可以把求max的期望轉化成求min的期望
max(a,b)=a+b−min(a,b)
max(S)=∑r⊆S(−1)∣T∣−1min(T)
同樣的 E(max(S))=E(∑r⊆S(−1)∣T∣−1min(T))
小練習
有n種卡片,每一秒都有pi的概率獲得第i種卡片,求每張卡片都至少有一張的期望時間
n≤20
第一類斯特林數
s(n,k)表示把n個數的排列中有k個環的方案數
遞推
考慮第n個數放在了哪裏
1.自己成爲一個環,方案爲s(n−1,k−1)
2.插入之前的環中,那麼一共有n−1的位置,所以方案爲s(n−1,k)⋅k
綜上
s(n,k)=s(n−1,k−1)+(n−1)⋅s(n−1,k)
小練習
求n個人分配到k個圓桌上,圓桌旋轉相等的方案數,即只關心每個人左邊的人是誰
n,k≤1000
s(n,k)=i=0∑ns(n−i,k−1)⋅(n−i)!(n−1)!(n−1)!1⋅s(n,k)=i=0∑ns(n−i,k−1)⋅(n−i)!1
使f(n,k)=i=0∑ni!s(i,k)那麼(n−1)!1s(n,k)=f(n−1,k−1)更新f(n,k)=f(n−1,k)+n!s(n,k)
第二類斯特林數
設S(n,m)表示把n個不同的球放到m個相同的盒子裏,且不允許盒子爲空的方案數
稱S爲第二類斯特靈數
遞推:
考慮第n個球放到了哪裏
1.自己佔一個盒子,方案爲S(n−1,m−1)
2.和之前的元素共佔m個盒子,方案爲S(n−1,m)⋅m,最後的係數是考慮放在不同位置。
這裏我們認爲{1}{24}{3}與{1}{2}{34}是不同的方案
而{1}{24}{3}與{1}{3}{24}是相同的方案
綜上
S(n,m)=S(n−1,m−1)+S(n−1,m)⋅m
邊界條件S(0,0)=1
容斥
S(n,m)=m!1∑k=0m(−1)k⋅C(m,k)⋅(m−k)n
也比較好理解,我們去枚舉一個空盒子的個數
答案 = 無視空盒子放的方案 - 至少有一個盒子爲空的方案 + 至少有兩個盒子爲空的方案 + …
這個式子可以用FFT優化,因此我們可以在O(nlogn)的複雜度內得到一行的斯特林數
小練習
BellNumbers - CF568B
求n個數分成若干個集合的方案數
B(n)=∑i=1nS(n,i)
歐拉數
n個數的排列字其中有k個數滿足pi<pi+1的排列個數
遞推求解
E(n,k)=(k+1)⋅E(n−1,k)+(n−k)⋅E(n−1,k−1)
數位dp
數位dp是計數類dp的一種,其基本問題爲求一段區間內滿足特定限制的數的個數。
其思路是在數位上進行dp,通常在十進制或二進制上進行。
在dp時可能需要記錄:當前在第幾位,上一個數字是什麼,和題目有關的一些信息,當前位是否和限制相等等。
注意:
如果是多個整數,可能需要記錄進位,借位等
注意前導零的問題(這玩意細節很多)
小練習
1.給定一個區間[l,r],問l到r的整數中有幾個轉換成二進制數後0比1多(不計前導零) (POJ3252)
1≤l<r≤2⋅109
2.求l到r之間且能被它的十進制表示的每個數字整除的數的個數。
如24是滿足條件的,因爲24是2和4的倍數。(CF55D)(時限:4s)
1≤l<r≤9⋅1018
提示:2520=lcm(1,2,3...9),所以根據一個數對2520取模後的值可以判斷這個數是否整除1...9中的數
3.有一個物品重量爲w,現在你有1,2,4,...,2n重量的砝碼各一個,問有多少種方法可以使天平平衡,w以二進制給出。(POJ3971)
n≤1000000,w≤2n
思考後,題意就是讓我們找一個x和y,使得w+x=y,x&y=0