加法和乘法原理
基本:
分类考虑加法原理。
分步考虑乘法原理。
排列组合
盒子与球都有标号。
Anm=n(n−1)(n−2)⋯(n−m+1)=(n−m)!n!
盒子无标号,球有标号。
Cnm=m!n(n−1)(n−2)⋯(n−m+1)=m!(n−m)!n!
组合相对于排列的区别就是去掉了顺序,对于 n>m,(mn)=0。
二项式定理
设 n 是正整数,对一切 x 和 y 有:
(x+y)n=k=0∑n(mn)xkyn−k⟹(ax+by)n=k=0∑n(mn)akxkbn−kyn−k
[NOIP2011提高组]计算系数
P1313 [NOIP2011 提高组] 计算系数
给定一个多项式 (by+ax)k,已知 a,b,k,n,m 请求出多项式展开后 xn×ym 项的系数。
0≤k≤1000,0≤n,m≤k,n+m=k,0≤a,b≤106。
结果就是 (mk)anbm,当且仅当 n+m=k。
组合数基本公式
(mn)=(m−1n−1)+(mn−1)(1)
(mn)=(n−mn)(2)
(mn)=kn(k−1n−1)(3)
(0n)+(1n)+⋯+(nn)=i=0∑n(in)=2n(4)
i=0∑n(−1)i(in)=[n=0](6)
(rn+r+1)=i=0∑r(in+i)(7)
证:
(rn+r+1)=(rn+r)+(r−1n+r)
(rn+r+1)=(rn+r)+(r−1n+r−1)+(r−2n+r−1)
展开最后一项直至最后一项为 (−10) ,无意义为 0。
证毕
(mn)×(rm)=(rn)×(m−rn−r)(8)
m×(mn)=n×(m−1n−1)(9)
证:
据上式 r=1 得证
证毕
(rn+m)=i=0∑r(in)×(r−im)(10)
证:
组合意义,分成 n,m,枚举一边,另一边对应。
证毕
i=0∑ni×(in)=n×2n−1(11)
证:
据
m×(mn)=n×(m−1n−1)得
i=0∑nn×(i−1n−1)
n×i=0∑n(i−1n−1)
令 i′=i−1,根据二项式定理
n×i=0∑n(i−1n−1)=n×2n−1
则,
i=0∑ni×(in)=n×2n−1
证毕
插板法
x1+x2+x3+x4+xn=k 的正整数解的组数。
(n−1k−1)
x1+x2+x3+x4+xn=k 的非负整数解的组数。
(n−1k−1+n)
x1+x2+x3+x4+xn=k 满足 xi≥ai的组数。
(n−1k−1−∑ai+n)
不相邻排列
1∼n 这 n 个自然数中选 k 个,这 k 个数中任何两个数都不相邻的组合有 (kn−k+1) 种。
P4071 [SDOI2016] 排列计数
求有多少种 1 到 n 的排列 a,满足序列恰好有 m 个位置 i,使得 ai=i。
思路1easy
思路2hard
离散与组合数学
多重集合
定义:多重集是指包含重复元素的广义集合。
多重集上的排列
多重集的排列数:
设 S={n1⋅a1,n2⋅a2,⋯,nk⋅ak} 表示由 n1 个 a1,n2 个 a2,…,nk 个 ak 组成的多重集,S 的全排列个数为
∏i=1kni!n!=n1!n2!⋯nk!n!
多重集的排列数常被称作 多重组合数,形如以下:
(n1,n2,⋯,nkn)=∏i=1kni!n!
e.g.(mn)⟺(m,n−mn)
多重集上的组合
错排列
令 x=1,y=1 , ∑i=0nCni=2i。
令 x=1,y=−1 , ∑i=0n(−1)i×Cni=[n=0]
假设存在两个函数 f,g。满足:
fn=i=0∑nCni×gi
那么考虑如何反求得 gn 关于 fn 的等式。
gn=i=0∑n[n−i=0]×Cni×gign=i=0∑nj=0∑n−i(−1)j×Cn−ij×Cni×gign=i=0∑nj=0∑n−i(−1)j×Cnj×Cn−ji×gign=j=0∑n(−1)j×Cnji=0∑n−jCn−ji×gign=i=0∑n(−1)i×Cni×fn−i=i=0∑n(−1)n−i×Cni×fi
所以得到二项式反演的结论:
fn=i=0∑nCni×gign=i=0∑n(−1)n−i×Cni×fi
问题描述:
有 n 个人编号为 1,...,n ,问这 n 个人站成一排全都站错位置的方案数。
上述站错的定义是:第 i 个人没有站在位置 i 上。
方法1: 递推
设 fn 表示答案,假设现在考虑到了前 i 个人的方案,即 fi 。
考虑第 i 个人站位情况:
显然第 i 个人的不能站在位置 i ,假设他站到了位置 k ,显然 k∈[1,i−1] ,那么继续考虑 k 的站位。
所以可以得到 f 的递推关系:
f1=0 , f2=1fi=(i−1)×(fi−1+fi−2) i≥3
方法2:二项式反演
设 fn 表示 n 个人随便站位的方案数, gn 表示 n 个人的都站错的方案数。
容易得到:
fn=n!fn=i=0∑nCni×gi
直接二项式反演可以得到:
gn=i=0∑n(−1)n−i×Cni×fi
同样可以直接线性的递推出答案。
圆排列
n 个人全部来围成一圈,所有的排列数记为 Qnn。考虑其中已经排好的一圈,从不同位置断开,又变成不同的队列。
所以有
Qnn×n=Ann⟹Qn=nAnn=(n−1)!
由此可知部分圆排列的公式:
Qnr=rAnr=r×(n−r)!n!
鸽巢原理/抽屉原理
反证法,构造题。
容斥原理
卡特兰
递推式
该递推关系的解为:
Hn=((n2n)n+1n≥2,n∈N+)
关于 Catalan 数的常见公式:
Hn={∑i=1nHi−1Hn−i1n≥2,n∈N+n=0,1
Hn=n+1Hn−1(4n−2)
Hn=(n2n)−(n−12n)
路径计数问题。
所有子集复杂度
枚举 S 的所有子集的子集的时间复杂度是 O(3n)
考虑一种常见的枚举子集方式:
1 2
| for (int s = u; s; s = (s - 1) & u)
|
显然单次枚举 S 的一个子集是 O(2∣S∣) 的。
复杂度证明:
O(T⊆S∑2∣T∣)
不难发现,S 中大小为 l 的子集个数是 (ln),这是简单的组合数学知识。
转而枚举 l,于是原式就化为
O(i=1∑n(in)2i)
根据二项式定理:
=i=1∑n(in)2i=i=1∑n(in)2i1n−i=(1+2)n−1=3n−1
于是,枚举 S 的所有子集的子集的时间复杂度是 O(3n) 的。
证毕。
反演
反演:两个函数或者数列之间的双向(求和)关系
比如前缀和 and 差分。
f(n)=∑i=0ng(i) 就是前缀和
g(n)=f(n)−f(n−1) 就是差分
这一对关系就是双向的求和关系。
当然这么说的话,求导和积分也就是双向的关系,那么他们也是符合反演的。
定义 A 为关系矩阵。
有 f=g×A,也有 g=f×A−1。
二项式反演
形式一
f(n)=i=0∑n(−1)i(in)g(i)
g(n)=i=0∑n(−1)i(in)f(i)
形式二
f(n)=i=0∑n(in)g(i)
g(n)=i=0∑n(−1)n−i(in)f(i)
形式三
f(n)=i=n∑(−1)i(ni)g(i)
g(n)=i=n∑(−1)i−n(ni)f(i)
形式四
f(n)=i=n∑(−1)i(ni)g(i)
g(n)=i=n∑(−1)i(ni)f(i)
这些形式都是非常对称的。
也就是说 A[n,i]=(−1)i(in) 是自逆的。
证:
(A∗A)[d,t]=i∑A[d,i]A[i,t]
=i=t∑d(−1)i(id)(−1)t(it)
=(−1)ti=t∑d(−1)ii!(d−i)!t!(i−t)!d!i!
=(−1)ti=t∑d(−1)i(d−t)!(d−i)!t!(i−t)!d!(d−t)!
t!(d−t)!d!⋅(d−i)!(i−t)!(d−t)!
=(td)⋅(d−id−t)
So:
=(−1)t(td)i=t∑d(−1)i(d−id−t)
=(−1)ti=0∑d−t(−1)i+t(d−t−id−t)
=(−1)t(−1)t(td)i=0∑d−t(−1)i(id−t)
=(−1)t(−1)t(td)(1−1)d−t
=(−1)2t(td)(1−1)d−t=[d=t]
这里的 (1−1)0=00 为什么是 1?(反正当时我是有这个疑惑,记得文化课老师说不能是1,但并不知道凭啥不能是 1?这个说法到底对不对???)
有些人将 0 不能是分母和这个的原因搞混了。 0 不能是分母是因为其会使运算变得混乱,
而这个是不是 1 都可以。
可能需要用到集合论的知识。
要证明a0=1 需要给出映射的定义:
-
f 是 X 和 Y 的笛卡尔积的子集。
-
对于任意 x∈X ,存在一定的 y∈Y ,使得 (x,y)∈f, 也就是常说的 y=f(x),在集合论中对函数的定义是集合之间的映
射关系。
定义基数:定义 ab 是由基数为 b 到基数为 a 的集合的映射全体所构成集合的基数。
考虑 a0 的情况,由一个空集到某一个基数为 a 的集合的映射有多少个。答案是有一个,空映射。为什么空集可以形成映射?看第一条,空集满足了。
看第二条,空集也是满足的。因为数理逻辑里面讲(参考《离散数学》)若 p,则 q" 在 p 是 false 的时候,这个命题是恒真的。
为什么呢?可以举一个很形象的例子:人们常会说:“如果太阳打西边出来,那我就不姓Y 。” 在这句话里面不管 “我” 姓不姓 Y,太阳都是
从东边出来的。也就是说这个 p 对 q 是没有什么影响的。并且在数理逻辑下,p 和 q 可以没有任何的内在联系,请和自然语言进行区分。
这里对 a 并没有加以任何限制,也就是说 a=0 也是可以的,所以 00=1。
但这个又可以通过代数系统解释出:由于 0 没有逆元,所以 00 没有意义,或不存在。
莫比乌斯反演
克罗内克函数
δ(x,y)={1 x=y0 otherwise
黎曼函数
ζ(x,y)={1 x≤xy(0) otherwise
这里的克罗内克函数和黎曼函数均为二变量函数。
当克罗内克函数和黎曼函数的第一个变量都为 1 时,我们得出了完全积性函数ε 和 I 的定义。
So:{ζ(1,n)=I(n)δ(1,n)=ε
And:
μ 是一个二变量函数 μ(x,y) ,定义为 ζ 的逆函数。
μ∗ζ=δ
∑x≤z≤yμ(x,z)=δ(x,y)
莫比乌斯反演定理:
G(x)=z≤x∑F(z)⟹F(x)=y≤x∑G(y)μ(y,x)
证明:
=y≤x∑μ(y,x)z∈X∑ζ(z,y)F(z)=z∈X∑y≤x∑μ(y,x)ζ(z,y)F(z)
=z∈X∑δ(z,x)F(z)=F(x)
在实际应用中常使用莫比乌斯函数的 μ(1,n) 的形式,缩写为 μ(n),当然你也可以说我们常用到的莫比乌斯函数是 I 的逆函数 I−1,大佬莫比乌斯将其命名为 μ。
当然也可以通过这个了解 μ 取值的定义。
So 也就有了这个:
F(n)=d∣n∑f(d)
g(d)=d∣n∑μ(d)g(dn)
自然这个也可以通过Dirichlet 卷积和积性函数来解释。
狄利克雷卷积 My blog。
由于这篇博客写的时间较早,可能无法谈到更深层的东西,还请见谅。
子集反演
g(S)=T⊂S∑f(T)
f(S)=T⊂S∑(−1)∣S∣−∣T∣g(T)
(一眼看上去,感觉这玩意就纯抽象,比二项式反演还要抽象, 为啥要学这个玩意啊,草。)
证明:
T⊂S∑(−1)∣S∣−∣T∣g(T)
=T⊂S∑(−1)∣S∣−∣T∣R⊂T∑f(R)
=R⊂S∑f(R)R⊂T⊂S∑(−1)∣S∣−∣T∣
当 R=S ,可以得知 ∑R⊂T⊂S(−1)∣S∣−∣T∣=1,否则任取 a∈S−R,f:T↦T⊕a 是双射,故 ∑R⊂T⊂S(−1)∣S∣−∣T∣=0
正好难算,至多好算: f(S)=∑T⊂Sg(T)⟹g(S)=∑T⊂S(−1)∣S∣−∣T∣f(T)
正好难算,至少好算: f(S)=∑S⊂Tg(T)⟹g(S)=∑S⊂T(−1)∣T∣−∣S∣f(T)
推广莫比乌斯函数:
μ(S)=(−1)∣S∣[S has no duplicate elements]
【莫比乌斯函数就是把整数当作质因数集合而来的反演系数!】
这个有点妙啊!
f(S)=T⊂S∑g(T)⟹g(S)=T⊂S∑μ(S−T)f(T)
f(S)=S⊂T∑g(T)⟹g(S)=T⊂S∑μ(T−s)f(T)
证明:
μ(A,A)=1
设 B=A, p=∣B∣−∣A∣
μ(A,B)
=−C:A⊆C⊂B∑μ(A,C)
=−C:A⊆C⊂B∑(−1)∣C∣−∣A∣
=−k=0∑p−1(−1)k(kP)
=−(−(−1)p(PP)+k=0∑p(−1)k(kP))
=(−1)p(PP)
=(−1)∣B∣−∣A∣
—— 转载自JLQ′sBlog
这也就是上面那样转化成立的原因。
求组合数
- 有模数
- 模数小 (Lucas)
- 预处理
- 无模数质因数分解
博弈论之NIM游戏
__END__