双射
单射 :不存在A中有两个元素 和 B 中同一个元素对应
满射 :B中每一个元素都在A中有对应的元素
单射 + 满射 = 双射
双射一定满足
∣
A
∣
=
∣
B
∣
|A|\!=\!|B|
∣A∣=∣B∣
Lucas定理
L
u
c
a
s
Lucas
Lucas定理是用来求
c
(
n
,
m
)
m
o
d
p
c(n,m) mod\,p
c(n,m)modp的值.
(
(
(p是素数
)
)
)
表达式如下:
C
(
n
,
m
)
%
p
=
C
(
n
/
p
,
m
/
p
)
∗
C
(
n
%
p
,
m
%
p
)
%
p
C(n,m)\%p=C(n/p,m/p)*C(n\%p,m\%p)\%p
C(n,m)%p=C(n/p,m/p)∗C(n%p,m%p)%p
可递归实现,时间复杂度:
O
(
p
l
o
g
p
(
n
)
)
O(plog_p(n))
O(plogp(n)),大致可认为是
O
(
p
l
o
g
n
)
O(plogn)
O(plogn)
容斥的扩展公式
有集合
S
1
.
.
.
S
n
S_1... S_n
S1...Sn 求
⋃
i
=
1
n
S
i
\bigcup_{i=1}^nS_i
⋃i=1nSi
⋃
i
=
1
n
S
i
=
∑
T
∈
S
∣
⋂
i
∈
T
S
i
∣
∗
(
−
1
)
∣
T
∣
−
1
\bigcup_{i=1}^nS_i \!= \sum_{T\in S}|\bigcap_{i\in T}S_i|*(-1)^{|T|-1}
⋃i=1nSi=∑T∈S∣⋂i∈TSi∣∗(−1)∣T∣−1
小练习
n
n
n个整数变量
x
i
x_i
xi满足
0
≤
x
i
≤
c
i
0\!\leq\!x_i\!\leq\! c_i
0≤xi≤ci
求
x
x
x的和等于
m
m
m的方案数
n
∗
m
≤
1
0
6
n*m\!\leq\!10^6
n∗m≤106
n
≤
20
,
m
≤
1
0
9
n\!\leq\!20,m\!\leq\!10^9
n≤20,m≤109
Min_Max容斥
有时
m
a
x
max
max的期望非常不好算,但是
m
i
n
min
min的期望很好算,那么就可以把求
m
a
x
max
max的期望转化成求
m
i
n
min
min的期望
m
a
x
(
a
,
b
)
=
a
+
b
−
m
i
n
(
a
,
b
)
max(a,b)=a+b-min(a,b)
max(a,b)=a+b−min(a,b)
m
a
x
(
S
)
=
∑
r
⊆
S
(
−
1
)
∣
T
∣
−
1
m
i
n
(
T
)
max(S)=\sum_{r\subseteq S}(-1)^{|T|-1}min(T)
max(S)=∑r⊆S(−1)∣T∣−1min(T)
同样的
E
(
m
a
x
(
S
)
)
=
E
(
∑
r
⊆
S
(
−
1
)
∣
T
∣
−
1
m
i
n
(
T
)
)
E(max(S))=E(\sum_{r\subseteq S}(-1)^{|T|-1}min(T))
E(max(S))=E(∑r⊆S(−1)∣T∣−1min(T))
小练习
有
n
n
n种卡片,每一秒都有
p
i
p_i
pi的概率获得第i种卡片,求每张卡片都至少有一张的期望时间
n
≤
20
n\leq20
n≤20
第一类斯特林数
s ( n , k ) s(n,k) s(n,k)表示把 n n n个数的排列中有 k k k个环的方案数
递推
考虑第
n
n
n个数放在了哪里
1.
1.
1.自己成为一个环,方案为
s
(
n
−
1
,
k
−
1
)
s(n−1,k−1)
s(n−1,k−1)
2.
2.
2.插入之前的环中,那么一共有
n
−
1
n-1
n−1的位置,所以方案为
s
(
n
−
1
,
k
)
⋅
k
s(n−1,k)\!\cdot\!k
s(n−1,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(n−1,k−1)+(n−1)⋅s(n−1,k)
小练习
求
n
n
n个人分配到
k
k
k个圆桌上,圆桌旋转相等的方案数,即只关心每个人左边的人是谁
n
,
k
≤
1000
n,k\!\leq\!1000
n,k≤1000
s
(
n
,
k
)
=
∑
i
=
0
n
s
(
n
−
i
,
k
−
1
)
⋅
(
n
−
1
)
!
(
n
−
i
)
!
1
(
n
−
1
)
!
⋅
s
(
n
,
k
)
=
∑
i
=
0
n
s
(
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=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
n
s
(
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=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
)
S(n,m)
S(n,m)表示把
n
n
n个不同的球放到
m
m
m个相同的盒子里,且不允许盒子为空的方案数
称
S
S
S为第二类斯特灵数
递推:
考虑第
n
n
n个球放到了哪里
1.
1.
1.自己占一个盒子,方案为
S
(
n
−
1
,
m
−
1
)
S(n−1,m−1)
S(n−1,m−1)
2.
2.
2.和之前的元素共占
m
m
m个盒子,方案为
S
(
n
−
1
,
m
)
⋅
m
S(n−1,m)\!\cdot\!m
S(n−1,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
)
⋅
m
S(n,m)\!=\!S(n−1,m−1)\!+\!S(n−1,m)\!\cdot\!m
S(n,m)=S(n−1,m−1)+S(n−1,m)⋅m
边
界
条
件
S
(
0
,
0
)
=
1
边界条件S(0,0)\!=\!1
边界条件S(0,0)=1
容斥
S
(
n
,
m
)
=
1
m
!
∑
k
=
0
m
(
−
1
)
k
⋅
C
(
m
,
k
)
⋅
(
m
−
k
)
n
S(n,m)=\frac{1}{m!}\sum^m_{k=0}(−1)^k\cdot C(m,k)\cdot(m−k)^n
S(n,m)=m!1∑k=0m(−1)k⋅C(m,k)⋅(m−k)n
也比较好理解,我们去枚举一个空盒子的个数
答案 = 无视空盒子放的方案 - 至少有一个盒子为空的方案 + 至少有两个盒子为空的方案 + …
这个式子可以用
F
F
T
FFT
FFT优化,因此我们可以在
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)的复杂度内得到一行的斯特林数
小练习
B
e
l
l
N
u
m
b
e
r
s
Bell Numbers
BellNumbers -
C
F
568
B
CF568B
CF568B
求
n
n
n个数分成若干个集合的方案数
B
(
n
)
=
∑
i
=
1
n
S
(
n
,
i
)
B(n)=\sum_{i=1}^{n}S(n,i)
B(n)=∑i=1nS(n,i)
欧拉数
n
n
n个数的排列字其中有
k
k
k个数满足
p
i
<
p
i
+
1
p_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(n−1,k)+(n−k)⋅E(n−1,k−1)
数位dp
数位
d
p
dp
dp是计数类
d
p
dp
dp的一种,其基本问题为求一段区间内满足特定限制的数的个数。
其思路是在数位上进行
d
p
dp
dp,通常在十进制或二进制上进行。
在
d
p
dp
dp时可能需要记录:当前在第几位,上一个数字是什么,和题目有关的一些信息,当前位是否和限制相等等。
注意:
如果是多个整数,可能需要记录进位,借位等
注意前导零的问题
(
(
(这玩意细节很多
)
)
)
小练习
1.
1.
1.给定一个区间
[
l
,
r
]
[l,r]
[l,r],问
l
l
l到
r
r
r的整数中有几个转换成二进制数后
0
0
0比
1
1
1多
(
(
(不计前导零
)
)
)
(
P
O
J
3252
)
(POJ3252)
(POJ3252)
1
≤
l
<
r
≤
2
⋅
1
0
9
1\!\leq\!l\!<\!r\!\leq\!2\!\cdot\!10^9
1≤l<r≤2⋅109
2.
2.
2.求
l
l
l到
r
r
r之间且能被它的十进制表示的每个数字整除的数的个数。
如
24
24
24是满足条件的,因为
24
24
24是
2
2
2和
4
4
4的倍数。
(
C
F
55
D
)
(
(CF 55D)(
(CF55D)(时限:
4
s
4s
4s
)
)
)
1
≤
l
<
r
≤
9
⋅
1
0
18
1\!\leq\!l\!<\!r\!\leq\!9\!\cdot\!10^{18}
1≤l<r≤9⋅1018
提示:
2520
=
l
c
m
(
1
,
2
,
3...9
)
2520\!=\!lcm(1,2,3...9)
2520=lcm(1,2,3...9),所以根据一个数对
2520
2520
2520取模后的值可以判断这个数是否整除
1...9
1...9
1...9中的数
3.
3.
3.有一个物品重量为
w
w
w,现在你有
1
,
2
,
4
,
.
.
.
,
2
n
1,2,4,...,2^n
1,2,4,...,2n重量的砝码各一个,问有多少种方法可以使天平平衡,
w
w
w以二进制给出。
(
P
O
J
3971
)
(POJ3971)
(POJ3971)
n
≤
1000000
,
w
≤
2
n
n\!\leq\!1000000,w\!\leq\!2^n
n≤1000000,w≤2n
思考后,题意就是让我们找一个
x
x
x和
y
y
y,使得
w
+
x
=
y
,
x
&
y
=
0
w\!+\!x\!=\!y,x\&y\!=\!0
w+x=y,x&y=0