容斥 组合计数

双射

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

Lucas定理

LucasLucasLucas定理是用来求c(n,m)mod pc(n,m) mod\,pc(n,m)modp的值.(((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)\%pC(n,m)%p=C(n/p,m/p)C(n%p,m%p)%p
可递归实现,时间复杂度:O(plogp(n))O(plog_p(n))O(plogp(n)),大致可认为是O(plogn)O(plogn)O(plogn)

容斥的扩展公式

有集合 S1...SnS_1... S_nS1...Sn⋃i=1nSi\bigcup_{i=1}^nS_ii=1nSi
⋃i=1nSi ⁣=∑T∈S∣⋂i∈TSi∣∗(−1)∣T∣−1\bigcup_{i=1}^nS_i \!= \sum_{T\in S}|\bigcap_{i\in T}S_i|*(-1)^{|T|-1}i=1nSi=TSiTSi(1)T1
小练习
nnn个整数变量xix_ixi满足0 ⁣≤ ⁣xi ⁣≤ ⁣ci0\!\leq\!x_i\!\leq\! c_i0xici
xxx的和等于mmm的方案数

n∗m ⁣≤ ⁣106n*m\!\leq\!10^6nm106
n ⁣≤ ⁣20,m ⁣≤ ⁣109n\!\leq\!20,m\!\leq\!10^9n20,m109

Min_Max容斥

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

小练习
nnn种卡片,每一秒都有pip_ipi的概率获得第i种卡片,求每张卡片都至少有一张的期望时间
n≤20n\leq20n20

第一类斯特林数

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

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

小练习
nnn个人分配到kkk个圆桌上,圆桌旋转相等的方案数,即只关心每个人左边的人是谁
n,k ⁣≤ ⁣1000n,k\!\leq\!1000n,k1000
s(n,k)=∑i=0ns(n−i,k−1)⋅(n−1)!(n−i)!1(n−1)!⋅s(n,k)=∑i=0ns(n−i,k−1)⋅1(n−i)! 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)!} s(n,k)=i=0ns(ni,k1)(ni)!(n1)!(n1)!1s(n,k)=i=0ns(ni,k1)(ni)!1
使f(n,k)=∑i=0ns(i,k)i!那么1(n−1)!s(n,k) ⁣= ⁣f(n−1,k−1)更新f(n,k) ⁣= ⁣f(n−1,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!} 使f(n,k)=i=0ni!s(i,k)(n1)!1s(n,k)=f(n1,k1)f(n,k)=f(n1,k)+n!s(n,k)

第二类斯特林数

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

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


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

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


欧拉数

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

数位dp

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


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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值