容斥 组合计数

双射

单射 :不存在A中有两个元素 和 B 中同一个元素对应
满射 :B中每一个元素都在A中有对应的元素
单射 + 满射 = 双射
双射一定满足A ⁣= ⁣B|A|\!=\!|B|

Lucas定理

LucasLucas定理是用来求c(n,m)modpc(n,m) mod\,p的值.((p是素数))
表达式如下:
C(n,m)%p=C(n/p,m/p)C(n%p,m%p)%pC(n,m)\%p=C(n/p,m/p)*C(n\%p,m\%p)\%p
可递归实现,时间复杂度:O(plogp(n))O(plog_p(n)),大致可认为是O(plogn)O(plogn)

容斥的扩展公式

有集合 S1...SnS_1... S_ni=1nSi\bigcup_{i=1}^nS_i
i=1nSi ⁣=TSiTSi(1)T1\bigcup_{i=1}^nS_i \!= \sum_{T\in S}|\bigcap_{i\in T}S_i|*(-1)^{|T|-1}
小练习
nn个整数变量xix_i满足0 ⁣ ⁣xi ⁣ ⁣ci0\!\leq\!x_i\!\leq\! c_i
xx的和等于mm的方案数

nm ⁣ ⁣106n*m\!\leq\!10^6
n ⁣ ⁣20,m ⁣ ⁣109n\!\leq\!20,m\!\leq\!10^9

Min_Max容斥

有时maxmax的期望非常不好算,但是minmin的期望很好算,那么就可以把求maxmax的期望转化成求minmin的期望
max(a,b)=a+bmin(a,b)max(a,b)=a+b-min(a,b)
max(S)=rS(1)T1min(T)max(S)=\sum_{r\subseteq S}(-1)^{|T|-1}min(T)
同样的 E(max(S))=E(rS(1)T1min(T))E(max(S))=E(\sum_{r\subseteq S}(-1)^{|T|-1}min(T))

小练习
nn种卡片,每一秒都有pip_i的概率获得第i种卡片,求每张卡片都至少有一张的期望时间
n20n\leq20

第一类斯特林数

s(n,k)s(n,k)表示把nn个数的排列中有kk个环的方案数

递推
考虑第nn个数放在了哪里
1.1.自己成为一个环,方案为s(n1,k1)s(n−1,k−1)
2.2.插入之前的环中,那么一共有n1n-1的位置,所以方案为s(n1,k) ⁣ ⁣ks(n−1,k)\!\cdot\!k
综上
s(n,k) ⁣= ⁣s(n1,k1) ⁣+ ⁣(n1) ⁣ ⁣s(n1,k)s(n,k)\!=\!s(n-1,k-1)\!+\!(n-1)\!\cdot\! s(n-1,k)

小练习
nn个人分配到kk个圆桌上,圆桌旋转相等的方案数,即只关心每个人左边的人是谁
n,k ⁣ ⁣1000n,k\!\leq\!1000
s(n,k)=i=0ns(ni,k1)(n1)!(ni)!1(n1)!s(n,k)=i=0ns(ni,k1)1(ni)! s(n,k)=\sum_{i=0}^ns(n-i,k-1)\cdot\frac{(n-1)!}{(n-i)!}\\ \frac{1}{(n-1)!}\cdot s(n,k)=\sum_{i=0}^n s(n-i,k-1)\cdot\frac{1}{(n-i)!}
使f(n,k)=i=0ns(i,k)i!1(n1)!s(n,k) ⁣= ⁣f(n1,k1)f(n,k) ⁣= ⁣f(n1,k)+s(n,k)n! 使f(n,k)=\sum_{i=0}^n\frac{s(i,k)}{i!}\\ 那么\frac{1}{(n-1)!}s(n,k)\!=\!f(n-1,k-1)\\ 更新f(n,k)\!=\!f(n-1,k)+\frac{s(n,k)}{n!}

第二类斯特林数

S(n,m)S(n,m)表示把nn个不同的球放到mm个相同的盒子里,且不允许盒子为空的方案数
SS为第二类斯特灵数

递推:
考虑第nn个球放到了哪里
1.1.自己占一个盒子,方案为S(n1,m1)S(n−1,m−1)
2.2.和之前的元素共占mm个盒子,方案为S(n1,m) ⁣ ⁣mS(n−1,m)\!\cdot\!m,最后的系数是考虑放在不同位置。
这里我们认为{1}{24}{3}\{1\}\{2 4\}\{3\}{1}{2}{34}\{1\}\{2\}\{3 4\}是不同的方案
{1}{24}{3}\{1\}\{2 4\}\{3\}{1}{3}{24}\{1\}\{3\}\{2 4\}是相同的方案
综上
S(n,m) ⁣= ⁣S(n1,m1) ⁣+ ⁣S(n1,m) ⁣ ⁣mS(n,m)\!=\!S(n−1,m−1)\!+\!S(n−1,m)\!\cdot\!m
S(0,0) ⁣= ⁣1边界条件S(0,0)\!=\!1


容斥
S(n,m)=1m!k=0m(1)kC(m,k)(mk)nS(n,m)=\frac{1}{m!}\sum^m_{k=0}(−1)^k\cdot C(m,k)\cdot(m−k)^n
也比较好理解,我们去枚举一个空盒子的个数
答案 = 无视空盒子放的方案 - 至少有一个盒子为空的方案 + 至少有两个盒子为空的方案 + …
这个式子可以用FFTFFT优化,因此我们可以在O(nlogn)O(nlogn)的复杂度内得到一行的斯特林数

小练习
BellNumbersBell Numbers - CF568BCF568B
nn个数分成若干个集合的方案数
B(n)=i=1nS(n,i)B(n)=\sum_{i=1}^{n}S(n,i)


欧拉数

nn个数的排列字其中有kk个数满足pi<pi+1p_i<p_{i+1}的排列个数
递推求解
E(n,k)=(k+1) ⁣ ⁣E(n1,k) ⁣+ ⁣(nk) ⁣ ⁣E(n1,k1)E(n,k)=(k+1)\!\cdot\!E(n-1,k)\!+\!(n-k)\!\cdot\!E(n-1,k-1)

数位dp

数位dpdp是计数类dpdp的一种,其基本问题为求一段区间内满足特定限制的数的个数。
其思路是在数位上进行dpdp,通常在十进制或二进制上进行。
dpdp时可能需要记录:当前在第几位,上一个数字是什么,和题目有关的一些信息,当前位是否和限制相等等。
注意:
如果是多个整数,可能需要记录进位,借位等
注意前导零的问题((这玩意细节很多))
小练习
1.1.给定一个区间[l,r][l,r],问llrr的整数中有几个转换成二进制数后0011((不计前导零)) (POJ3252)(POJ3252)
1 ⁣ ⁣l ⁣< ⁣r ⁣ ⁣2 ⁣ ⁣1091\!\leq\!l\!<\!r\!\leq\!2\!\cdot\!10^9


2.2.llrr之间且能被它的十进制表示的每个数字整除的数的个数。
2424是满足条件的,因为24242244的倍数。(CF55D)((CF 55D)(时限:4s4s))
1 ⁣ ⁣l ⁣< ⁣r ⁣ ⁣9 ⁣ ⁣10181\!\leq\!l\!<\!r\!\leq\!9\!\cdot\!10^{18}
提示:2520 ⁣= ⁣lcm(1,2,3...9)2520\!=\!lcm(1,2,3...9),所以根据一个数对25202520取模后的值可以判断这个数是否整除1...91...9中的数


3.3.有一个物品重量为ww,现在你有1,2,4,...,2n1,2,4,...,2^n重量的砝码各一个,问有多少种方法可以使天平平衡,ww以二进制给出。(POJ3971)(POJ3971)
n ⁣ ⁣1000000,w ⁣ ⁣2nn\!\leq\!1000000,w\!\leq\!2^n
思考后,题意就是让我们找一个xxyy,使得w ⁣+ ⁣x ⁣= ⁣y,x&y ⁣= ⁣0w\!+\!x\!=\!y,x\&y\!=\!0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章