双射
单射 :不存在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