组合数学 part1

组合数学

1.1 加法原理、乘法原理

在组合数学中,加法原理和乘法原理是两条基本定理。

加法原理 如果解的集合可以划分成若干非空子集,则解可以表示为这些子集的并集。通俗来讲,就是一个问题的答案可以分成若干互不重叠的类,求出来每一类的答案,它们的和即为原问题的答案。

例1:某班有20名男生,30名女生,问该班有多少学生?

​ 答案为:20+30=50

例2:从重庆去武汉有许多交通工具可以选择。如果坐飞机,有25个航班;如果坐火车,有16个车次;如果坐轮船,有4个航班。如果只允许坐飞机、火车和轮船之一,从重庆到武汉有多少种方式?

​ 答案为:25+16+4=45

乘法原理 如果一个问题可以分为若干环节完成,完成第1个环节有 a 1 a_1 a1种方案,完成第2个环节有 a 2 a_2 a2种方案,……,完成第k个环节 a k a_k ak种方案,则问题的方案总数为每一个环节的方案数的乘积。 a n s = Π i = 1 k a i ans=\Pi_{i=1}^ka_i ans=Πi=1kai

例3:小明要从重庆到北京,他想先坐船到武汉,再从武汉坐高铁到北京去。已知从重庆到武汉的轮船有4班,从武汉到北京的高铁有15趟。请问他从重庆经过武汉到北京有多少种方式?

答案为: 4 × 15 = 60 4\times 15=60 4×15=60

例4: 从5位男人、6位妇女、2名男孩和4名女孩中选择一男人、一妇女、一男孩和一女孩,问有多少种方法?

答案为:5×6×2×4=240种。

例5:粉笔根据颜色分有红、黄、蓝三种,根据长度分可以分为长、中、短三类,根据直径可以分为粗、细两类,问粉笔最多有多少种分类?

分析:根据题意,确定一种粉笔需要去确定它的颜色、长度、直径三个属性,三个属性都确定了才能确定这种粉笔的分类。所以可以应用乘法原理,答案为:

3 × 3 × 2 = 18 3 \times 3\times 2=18 3×3×2=18

1.2 排列组合

1.2.1 排列

排列就是指从给定个数的元素中取出指定个数的元素进行排序,或者说,从总数固定的元素中有序地取出若干元素的方案数。

从n个元素中取出r个元素的排列,记作 P n r P_n^r Pnr,或为 P ( n , r ) . P(n,r). P(n,r).

取出r个元素,可以分成r个环节,第1个环节有n种选择,第2个环节有n-1种选择,第i个环节有 n − i + 1 n-i+1 ni+1种选择,则根据乘法原理,有:

P n r = Π i = 1 r ( n − i + 1 ) P_n^r=\Pi_{i=1}^r (n-i+1) Pnr=Πi=1r(ni+1)

例1:如果只考虑小写字母,三个不同的字母可以组成多少个单词。(不考虑单词是否真实存在).

分析:小写字母有26个,从中取出3个不同字母的排列为:

P ( 26 , 3 ) = 26 ∗ 25 ∗ 24 = 1560 P(26,3)=26*25*24=1560 P(26,3)=262524=1560

例2:例.将字母表中的26个字母排序使得元音字母a,o,e,i,u中任意两个都不得相继出现,这种排序的方法的总数是多少?
该问题的解(象许多的计数问题一样)一旦看出如何去做则可立刻得出。我们考虑两个要完成的主要任务。第一个任务是决定如何对这些辅音字母排序。计有21个辅音字母,故有辅音字母的排列数是 P ( 21 , 21 ) P(21,21) P(21,21)。由于我们不能有两个元音字母相连地出现在最终的字母排序中,因此这些元音字母必须放在这些辅音字母之前之后之间的22个空间。我们的第二个任务是把这些元音字母放入这些位置。对于a有22个位置,对。有21个位置,有20个位置,o有19个位置,a有18个位置。就是说,第二个任务可以用:

P ( 22 , 5 ) = 22 × 21 × 20 × 19 × 18 = 3160080 P(22,5)=22\times 21 \times 20 \times 19 \times 18=3160080 P(22,5)=22×21×20×19×18=3160080
所以,总的方案是 P ( 21 , 21 ) × P ( 22 , 5 ) P(21,21) \times P(22, 5) P(21,21)×P(22,5)

例3:求有多少个没有重复数字且能够被5整除的四位奇数?

分析 因为是奇数,且要能被5整除,所以个位必须为5.

又因为千位不能为0,所以千位上有8种选择;

百位不能与个位、千位相同,所以百位也有8种选择;

十位有7种选择。

所以,答案为 8 × 8 × 7 = 448 8 \times 8 \times 7=448 8×8×7=448

有重复元素的排列

如果从n个元素中取出r个元素,元素可以重复选取,问题有多少种方案?

分析:r个元素可以分为r个环节完成,每一个环节有n种选择,所以答案为:

a n s = n r ans=n^r ans=nr

1.2.2 组合

组合从给定个数的元素中取出指定个数的元素,不考虑其顺序。

从n个元素中取出r个元素的组合,记作 C n r C_n^r Cnr,或为 C ( n , r ) C(n,r) C(n,r).

只要取出的元素是相同的,不管它们如何排列,都是同一种方案。如果取出的元素是r个,则有 r ! r! r!种排列,其实都是同一种组合。

所以, C n r = P n r / r ! C_n^r=P_n^r/r! Cnr=Pnr/r!

例1: 一个盒子里装了10个不同种类的球,每种球1个,问取出3个球有多少种不同的方案。不考虑顺序。

分析:因为不考虑顺序,所以它是一个组合数。

答案为:

C ( 10 , 3 ) = 10 × 9 × 8 1 × 2 × 3 = 120 C(10,3)=\frac{10\times9\times 8}{1\times2\times3}=120 C(10,3)=1×2×310×9×8=120

例2:从[1,300]中取3个不同的数,使这3个数的和能被3整除,有多少种方案?

分析:将[1,300]分成3类:
​ A={i|i≡1(mod 3)}={1,4,7,…,298},
​ B={i|i≡2(mod 3)}={2,5,8,…,299},
​ C={i|i≡3(mod 3)}={3,6,9,…,300}.
​ 要满足条件,有四种解法:
​ 1).3个数同属于A;

​ 2).3个数同属于B;

​ 3).3个数同属于C;

​ 4).A,B,C各取一数.
故共有 3 × C ( 100 , 3 ) + 10 0 3 = 485100 + 1000000 = 1485100 3\times C(100,3)+100^3=485100+1000000=1485100 3×C(100,3)+1003=485100+1000000=1485100

鸽笼原理

这个定理的可以描述为:

如果有n+1只鸽子进入n个笼子,则必有两只鸽子在同一个笼子里。其中n>0。

它也可以称为抽屉原理,描述大同小异。

有n+1个物品放入n个抽屉,则必有两个物品在同一个抽屉里。其中n>0。

有重复元素的组合

n n n个元素中取出 k k k个元素的组合,元素可以重复选取,问有多少种方案?

如n=3,r=2,有6种选择:(1,1),(1,2),(1,3),(2,2),(2,3),(3,3)
分析:设第一个元素选择 x 1 x_1 x1个,第二个元素选择 x 2 x_2 x2个,……,第n个元素选择 x n x_n xn个。则有方程: x 1 + x 2 + … … x n = k x_1+x_2+……x_n=k x1+x2+xn=k。问题转换为求方程的非负整数解的个数。令 y i = x i + 1 y_i=x_i+1 yi=xi+1,则答案为 y 1 + y 2 + … + y n = k + n y_1+y_2+…+y_n=k+n y1+y2++yn=k+n的正整数解的个数。想想 k + n k+n k+n个相同的小球拍成1列,现在要把它分成 n n n个部分,则只需在其中放置n-1块隔板即可。一共有 k + n − 1 k+n-1 k+n1个位置用来放隔板,所以答案为 C ( n + k − 1 , n − 1 ) C(n+k-1,n-1) C(n+k1,n1)

1.2.3 盒子与球常见模型

最基本的模型

n个不同的球放入m个不同的盒子中,球必须全部放完,问有多少种方案?

分析:每个球都有m种选择,所以答案为: a n s = m n ans=m^n ans=mn

根据球是否相同、盒子是否相同,球是否必须放完,盒子是否可以为空,盒子与球的问题可以扩展出许多模型。

在学习这些模型之前,我们先来学习两种模型:集合划分模型和整数分拆模型。

集合划分

将一个n个元素的集合 S S S分成m个非空子集 S 1 , S 2 , … , S m S_1,S_2,\dots,S_m S1,S2,,Sm,使得这些子集没有交集,并且它们的并集等于全集,则称这m个子集是集合 S S S的一个划分。

S ( n , m ) S(n,m) S(n,m)表示 n n n个元素的集合的划分方案数,则有下列递推式:

S ( n , m ) = S ( n − 1 , m − 1 ) + m ∗ S ( n − 1 , m ) S(n,m)=S(n-1,m-1)+m*S(n-1,m) S(n,m)=S(n1,m1)+mS(n1,m)

S ( n , m ) S(n,m) S(n,m)作为特定的标记,用来表示集合划分方案数,实际上, S ( n , m ) S(n,m) S(n,m)即为我们后面要学习的第二类斯特林数列。

整数分拆模型

有序分拆:将整数n分成k个有序部分,这个问题可以采用隔板法解决,即在 n n n个球中插入 k − 1 k-1 k1个隔板,答案为 C ( n − 1 , k − 1 ) C(n-1,k-1) C(n1,k1)

无序分拆:设 p ( n , k ) p(n,k) p(n,k)表示将整数 n n n拆成 k k k个无序部分的方案数,则有如下递推式:

p ( n , k ) = p ( n − 1 , k − 1 ) + p ( n − k , k ) p(n,k)=p(n-1,k-1)+p(n-k,k) p(n,k)=p(n1,k1)+p(nk,k)

p ( n , k ) p(n,k) p(n,k)也是作为特定标记,用来表示整数的无序分拆。此处注意 p p p是小写,和排列的标记 P P P有区别。

n个球m个盒子球相同球不同
盒子相同,可以为空,球必须放完 ∑ i = 1 m p ( n , i ) \sum_{i=1}^mp(n,i) i=1mp(n,i) ∑ i = 1 m S ( n , i ) \sum_{i=1}^mS(n,i) i=1mS(n,i)
盒子相同,不能为空,球必须放完 p ( n , m ) p(n,m) p(n,m) S ( n , m ) S(n, m) S(n,m)
盒子不同,可以为空,球必须放完 C ( n + m − 1 , m − 1 ) C(n+m-1,m-1) C(n+m1,m1) m n m^n mn
盒子不同,不能为空,球必须放完 C ( n − 1 , m − 1 ) C(n-1,m-1) C(n1,m1) S ( n , m ) ∗ m ! S(n,m)*m! S(n,m)m!
盒子相同,可以为空,球可以不放完 ∑ i = 1 m + 1 p ( n , i ) \sum_{i=1}^{m+1}p(n,i) i=1m+1p(n,i) ∑ i = 0 n ∑ j = 1 m C ( n , i ) S ( n − i , j ) \sum_{i=0}^n\sum_{j=1}^mC(n,i)S(n-i,j) i=0nj=1mC(n,i)S(ni,j)
盒子相同,不能为空,球可以不放完 p ( n , m + 1 ) + p ( n , m ) p(n,m+1)+p(n,m) p(n,m+1)+p(n,m) ∑ i = 0 n C ( n , i ) ∗ S ( n − i , m ) \sum_{i=0}^nC(n,i)*S(n-i,m) i=0nC(n,i)S(ni,m)
盒子不同,可以为空,球可以不放完 C ( n + m , m ) C(n+m,m) C(n+m,m) ( m + 1 ) n (m+1)^n (m+1)n
盒子不同,不能为空,球可以不放完 C ( n , m ) C(n,m) C(n,m) ∑ i = 0 n − m C ( n , i ) S ( n − i , m ) ∗ m ! \sum_{i=0}^{n-m}C(n,i)S(n-i,m)*m! i=0nmC(n,i)S(ni,m)m!

1.2.4 常见组合数公式

杨辉三角

杨辉三角(也称帕斯卡三角)相信很多人都不陌生,它是一个无限对称的数字金字塔,从顶部的单个1开始,下面一行中的每个数字都是上面两个数字的和。

杨辉三角,是二项式系数在三角形中的一种几何排列,在中国南宋数学家杨辉1261年所著的《详解九章算法》一书中出现。在欧洲,帕斯卡(1623—-1662)在1654年发现这一规律,所以这个表又叫做帕斯卡三角形。帕斯卡的发现比杨辉要迟393年,比贾宪迟600年。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6DnZQ8hb-1634528354105)(./image-20201113070752261.png)]

杨辉三角的性质

注意:行、列的下标都从0开始计算。

1.杨辉三角中的第i行j列的值就是 C ( i , j ) C(i,j) C(i,j).

2.杨辉三角第i行的和为 2 i 2^i 2i.

3.杨辉三角中每一列的前 i i i个数之和都等于下一列的第 i i i个数。

4.杨辉三角中每一个数都等于它上方两个数之和。

杨辉三角和许多组合数公式都有关联,下面的组合数公式你能在杨辉三角发现吗?

组合数常见公式:

1. C ( i , j ) = C ( i , i − j ) C(i,j)=C(i,i-j) C(i,j)=C(i,ij)

2.二项式定理: ( x + y ) n = ∑ i = 0 n C ( n , i ) x i y n − i (x+y)^n=\sum_{i=0}^nC(n,i)x^iy^{n-i} (x+y)n=i=0nC(n,i)xiyni

3. C ( i , j ) = C ( i − 1 , j − 1 ) + C ( i − 1 , j ) C(i,j)=C(i-1,j-1)+C(i-1,j) C(i,j)=C(i1,j1)+C(i1,j)

4. ∑ i = j k C ( i , j ) = C ( k + 1 , j + 1 ) \sum_{i=j}^kC(i,j)=C(k+1,j+1) i=jkC(i,j)=C(k+1,j+1)

2 容斥原理

德·摩根定理

在命题逻辑和逻辑代数中,德·摩根定律(或称德·摩根定理)是关于命题逻辑规律的一对法则。 奥古斯都·德·摩根首先发现了在命题逻辑中存在着下面这些关系:

P , Q P,Q PQ为全集 U U U的两个子集,有:

Q ∩ P ‾ = Q ‾ ∪ P ‾ \overline{Q \cap P}=\overline{Q} \cup \overline{P} QP=QP

Q ∪ P ‾ = Q ‾ ∩ P ‾ \overline{Q \cup P}=\overline{Q} \cap \overline{P} QP=QP

德·摩根定理还可以推广到多个子集的情形:

A 1 , A 2 , … … A n A_1,A_2,……A_n A1,A2,An是全集 U U U的子集,有:

A 1 ∩ A 2 ∩ ⋯ ∩ A n ‾ = A 1 ‾ ∪ A 2 ‾ ∪ ⋯ ∪ A n ‾ \overline{A_1\cap A_2 \cap \dots \cap A_n}=\overline{A_1}\cup\overline{A_2}\cup\dots \cup\overline{A_n} A1A2An=A1A2An

A 1 ∪ A 2 ∪ ⋯ ∪ A n ‾ = A 1 ‾ ∩ A 2 ‾ ∩ ⋯ ∩ A n ‾ \overline{A_1 \cup A_2 \cup \dots \cup A_n}=\overline{A_1}\cap\overline{A_2}\cap\dots \cap \overline{A_n} A1A2An=A1A2An

德·摩根定律在数理逻辑的定理推演中,在计算机的逻辑设计中以及数学的集合运算中都起着重要的作用。 他的发现影响了乔治·布尔从事的逻辑问题代数解法的研究。这巩固了德摩根作为该规律的发现者的地位,尽管亚里士多德也曾注意到类似现象,且这也为古希腊与中世纪的逻辑学家熟知。

该定律也被称作反演律。

容斥原理

S S S为有穷集合, P 1 , P 2 , … , P n P_1,P_2,\dots,P_n P1,P2,,Pn n n n条性质,S中的元素可能符合这n条性质中的0条、1条、2条、……、n条。设 A i ( 1 ≤ i ≤ n ) A_i(1\leq i \leq n) Ai(1in)表示S中具备性质 P i P_i Pi的元素集合。

S S S中不具有任何一种性质的元素数是:

∣ A 1 ‾ ∩ A 2 ‾ ∩ ⋯ ∩ A n ‾ ∣ = ∣ S ∣ − ∑ i = 1 n A i + ∑ i < j ∣ A i ∩ A j ∣ − ∑ i < j < k ∣ A i ∩ A j ∩ A k ∣ + ⋯ + ( − 1 ) n ∣ A 1 ∩ A 2 ∩ ⋯ ∩ A n ∣ \left | \overline{A_1} \cap \overline{A_2} \cap \dots \cap \overline{A_n} \right |=|S|-\sum_{i=1}^n A_i+\sum_{i<j}|A_i \cap A_j|-\sum_{i<j<k}|A_i\cap A_j \cap A_k|+\dots+(-1)^n|A_1 \cap A_2 \cap \dots \cap A_n| A1A2An=Si=1nAi+i<jAiAji<j<kAiAjAk++(1)nA1A2An

S中至少具有一种性质的元素个数是:

∣ A 1 ∪ A 2 ∪ ⋯ ∪ A n ∣ = ∑ i = 1 n ∣ A i ∣ − ∑ i < j ∣ A i ∩ A j ∣ + ⋯ + ( − 1 ) n + 1 ∣ A 1 ∩ A 2 ⋯ ∩ A n ∣ |A_1 \cup A_2 \cup \dots \cup A_n|=\sum_{i=1}^n|A_i|-\sum_{i<j}|A_i\cap A_j|+\dots+(-1)^{n+1}|A_1 \cap A_2\dots\cap A_n| A1A2An=i=1nAii<jAiAj++(1)n+1A1A2An

例1. 一年级某班有30人,考了语文和数学,语文上90的有17人,数学上90的有25人,语文和数学同时上90的有15人。问有多少同学两门课都没有上90?

分析:设语文上90为条件1,数学上90为条件2, A 1 A_1 A1表示满足条件1的人数, A 2 A_2 A2表示满足条件2的人数,全集为 S S S.

则 根据容斥原理,

∣ A 1 ‾ ∩ A 2 ‾ ∣ = ∣ S ∣ − ∣ A 1 ∣ − ∣ A 2 ∣ + ∣ A 1 ∩ A 2 ∣ = 30 − 17 − 25 + 15 = 3 |\overline {A_1} \cap \overline{A_2}|=|S|-|A_1|-|A_2|+|A_1 \cap A_2|=30-17-25+15=3 A1A2=SA1A2+A1A2=301725+15=3

例2. 班里有50名学生,每个人都必须选修一门运动科目,选修篮球的有15人,选修足球的有20人,选修乒乓球的有30人,同时选修篮球和足球的有8人,同时选修乒乓球和足球的有5人,同时选修篮球和乒乓球的有6人,问选修了三门科目的有多少人?

分析:设选修了三门科目的人为 x x x人。根据容斥原理:

50 = 15 + 20 + 30 − 8 − 5 − 6 + x 50=15+20+30-8-5-6+x 50=15+20+30856+x

x = 4 x=4 x=4

例3. 错位排列

n n n个位置,编号为1到 n n n。现在有 n n n个人,编号也是 1 1 1 n n n,每个人要站到一个位置上去。如果一种排列方式,每个人的编号和他坐在位置的编号都不相等,则称为错位排列。问一共有多少种错位排列?

分析:

任意排列的方案有 n ! n! n!,至少一个人没有错位的方案是 C ( n , 1 ) ∗ ( n − 1 ) ! C(n,1)*(n-1)! C(n,1)(n1)!,至少两个人没有错位的方案是 C ( n , 2 ) ∗ ( n − 2 ) ! C(n,2)*(n-2)! C(n,2)(n2)!,至少 i i i个人没有错位的方案数是 C ( n , i ) ∗ ( n − i ) ! C(n,i)*(n-i)! C(n,i)(ni)!

a n s = n ! − C ( n , 1 ) ∗ ( n − 1 ) ! + C ( n , 2 ) ∗ ( n − 2 ) ! − … ( − 1 ) n ∗ C ( n , n ) ∗ ( n − n ) ! = n ! ( 1 − 1 / 1 ! + 1 / 2 ! − 1 / 3 ! + … ( − 1 ) n / n ! ) \begin{aligned} ans &= n!-C(n,1)*(n-1)!+C(n,2)*(n-2)!-…(-1)^n*C(n,n)*(n-n)! \\ &= n!(1-1/1!+1/2!-1/3!+…(-1)^n/n!) \end{aligned} ans=n!C(n,1)(n1)!+C(n,2)(n2)!(1)nC(n,n)(nn)!=n!(11/1!+1/2!1/3!+(1)n/n!)

例题1 对角线

题目描述

有一个棱长为n的立方体,在其中填充数量足够多的棱长分别为a,b,c的小长方体。保证a,b,c是n的约数。
所有小长方体同方向整齐排列,将正方体完全填满为止。问此时正方体的一条对角线所穿过的长方体的数量。

数据规模

n<=100000

分析

将对角线投影到x,y,z轴三个方向,设小长方体与x轴平行的棱长为a,与y轴平行的棱长为b,与z轴平行的棱长为c,垂直于x轴的两个面为A面和B面,垂直于y轴的两个面为C面和D面,垂直于z轴的两个面为E面和F面。
则对角线的在x轴方向一定会穿过n/a个小长方体的A面,在y轴方向一定为穿过n/b个的C面,在z轴方向会穿过n/c个小长方体的E面。但是有n/lcm(a,b)的小长方体,对角线是从A和C面之间的棱上穿过去的,所以,这些被计算了两次,所以要减掉n/lcm(a,b)个。同理,也要减掉n/lcm(a,c)与n/lcm(b,c)。
又有n/lcm(a,b,c)个小长方体是从顶点处穿进去的。最后要加上这一部分。
所以答案为n/a+n/b+n/c-n/lcm(a,b)-n/lcm(a,c)-n/lcm(b,c)+n/lcm(a,b,c)

例题2 分特产

题目描述

JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们。
JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任
何一个同学因为没有拿到特产而感到失落,所以每个同学都必须至少分得一个特产。
例如,JYY 带来了2 袋麻花和1 袋包子,分给A 和B 两位同学,那么共有4 种不同的
分配方法:
A:麻花,B:麻花、包子
A:麻花、麻花,B:包子
A:包子,B:麻花、麻花
A:麻花、包子,B:麻花

输入格式

输入数据第一行是同学的数量N 和特产的数量M。
第二行包含M 个整数,表示每一种特产的数量。
N, M 不超过1000,每一种特产的数量不超过1000

输出格式

输出一行,不同分配方案的总数。由于输出结果可能非常巨大,你只需要输出最终结果
MOD 1,000,000,007 的数值就可以了。

分析

先考虑一种特产的情况
可以使用容斥原理。设S表示全集,Pi表示至少有i个人没有分到特产的方案数。
A n s = S − P 1 + P 2 − P 3 + ⋯ + ( − 1 ) n × P n Ans=S-P_1+P_2-P_3+\dots+(-1)^n \times Pn Ans=SP1+P2P3++(1)n×Pn
设该特产的数量为k,则S=C(n+k-1,k-1),Pi=C(n,i)*C(n+k-i-1,k-1)
然后考虑多种特产的情形,发现适用乘法原理。
a n s = ∏ S i + ∑ j = 1 n ( − 1 ) j ∏ i = 1 M P i j ans = \prod S_i + \sum_{j=1}^n (-1)^j \prod_{i=1}^M P_{ij} ans=Si+j=1n(1)ji=1MPij
其中Pij表示至少有j个人没有分到第i种特产的方案数。

例题3 集合计数 BZOJ2839

题目描述

一个有N个元素的集合有 2 N 2^N 2N个不同子集(包含空集),现在要在这 2 N 2^N 2N个集合中取出若干集合(至少一个),使得它们的交集的元素个数为 K K K,求取法的方案数,答案模1000000007。

输入格式

一行两个整数N,K

输出格式

一行为答案

数据规模

1 ≤ N ≤ 1000000 , 0 ≤ K ≤ N 1 \leq N \leq 1000000,0 \leq K \leq N 1N1000000,0KN
分析:
首先可计算交集的元素至少为k个的方案:
S ( k ) = C ( n , k ) × ( 2 2 n − k − 1 ) S(k) = C(n,k) \times (2^{2^{n-k}} - 1) S(k)=C(n,k)×(22nk1)
根据容斥原理:
交集的元素等于k的方案数为:
a n s = ∑ j ≥ k ( ( − 1 ) j − k × S ( j ) × C ( j , k ) ) ans = \sum_{j \geq k} ((-1)^{j-k} \times S(j) \times C(j,k)) ans=jk((1)jk×S(j)×C(j,k))

其中计算 2 2 t 2^{2^t} 22t可以采用以下式子:
2 2 t = 2 2 t − 1 × 2 2 t − 1 2^{2^t} = 2^{2^{t-1}} \times 2^{2^{t-1}} 22t=22t1×22t1
也可以采用欧拉定理, 2 t % m o d = 2 t % ( m o d − 1 ) % m o d 2^t \% mod = 2^{t \%(mod - 1)} \%mod 2t%mod=2t%(mod1)%mod

例题4 CQOI2011 放棋子 BZOJ3294

题目描述

在一个m行n列的棋盘里放一些彩色的棋子,使得每个格子最多放一个棋子,且不同颜色的棋子不能在同一行或者同一列。有多少种方法?例如,n=m=3,有两个白棋子和一个灰棋子,下面左边两种方法都是合法的,但右边两种都是非法的。棋子都需要放完。
在这里插入图片描述

输入格式

输入第一行为两个整数n, m, c,即行数、列数和棋子的颜色数。第二行包含c个正整数,即每个颜色的棋子数。所有颜色的棋子总数保证不超过nm。

输出格式

输出仅一行,即方案总数除以 1,000,000,009的余数。

分析

因为每行每列都只能出现一种颜色的棋子,所以,可以独立的处理每种棋子。设 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示前i种棋子刚好占了j行k列的方案数, g [ i ] [ j ] [ k ] g[i][j][k] g[i][j][k]表示第i种棋子刚好占了j行k列的方案数,则有:
f [ i ] [ j ] [ k ] = ∑ f [ i − 1 ] [ j − x ] [ k − y ] ∗ g [ i ] [ x ] [ y ] ∗ C ( n − j + x , x ) ∗ C ( m − j + y , y ) f[i][j][k]=\sum f[i-1][j-x][k-y]*g[i][x][y]*C(n-j+x, x)*C(m-j+y,y) f[i][j][k]=f[i1][jx][ky]g[i][x][y]C(nj+x,x)C(mj+y,y)
其中 x ≤ j ∧ y ≤ k ∧ x ∗ y ≥ c n t [ i ] x\leq j \land y \leq k \land x*y \geq cnt[i] xjykxycnt[i]

g [ i ] [ j ] [ k ] = ∑ j ′ ≤ j ∧ k ′ ≤ k ( − 1 ) j − j ′ + k − k ′ C ( j , j ′ ) ∗ C ( k , k ′ ) ∗ C ( j ′ ∗ k ′ , c n t [ i ] ) g[i][j][k]=\sum_{j'\leq j \land k'\leq k}(-1)^{j-j'+k-k'}C(j,j')*C(k,k')*C(j'*k', cnt[i]) g[i][j][k]=jjkk(1)jj+kkC(j,j)C(k,k)C(jk,cnt[i])

a n s = ∑ f [ n ] [ i ] [ j ] ans = \sum f[n][i][j] ans=f[n][i][j]

例题5 棋盘染色

题目描述

棋盘是一个 n × m n \times m n×m的矩形,分成n行m列共 n × m n \times m n×m个小方格。现在萌萌和南南有C种不同颜色的颜料,他们希望把棋盘用这些颜料染色,并满足以下规定:

  1. 棋盘的每一个小方格既可以染色(染成C种颜色中的一种) ,也可以不染色。
  2. 棋盘的每一行至少有一个小方格被染色。
  3. 棋盘的每一列至少有一个小方格被染色。
  4. 每种颜色都在棋盘上出现至少一次。

以下是一些将3×3棋盘染成C = 3种颜色(红、黄、蓝)的例子:

在这里插入图片描述

请你求出满足要求的不同的染色方案总数。只要存在一个位置的颜色不同,即认为两个染色方案是不同的
输入只有一行 3 个整数 n,m,c 。
输出一个整数,为不同染色方案总数。因为总数可能很大,只需输出总数 mod 1,000,000,007的值。

数据规模

1 ≤ n , m , c ≤ 400 1 \leq n,m,c \leq 400 1n,m,c400

分析

使用容斥原理.
a n s = ∑ c ′ ≤ c , n ′ ≤ n , m ′ ≤ m ( − 1 ) c − c ′ + n − n ′ + m − m ′ ( c ′ + 1 ) n ′ ∗ m ′ ∗ C ( c , c ′ ) ∗ C ( n , n ′ ) ∗ C ( m , m ′ ) ans = \sum_{c'\leq c, n' \leq n, m' \leq m} (-1)^{c-c'+n-n'+m-m'}(c'+1)^{n'*m'}*C(c,c')*C(n,n')*C(m,m') ans=cc,nn,mm(1)cc+nn+mm(c+1)nmC(c,c)C(n,n)C(m,m)

例题6 两双手

题意描述

老W是个棋艺高超的棋手,他最喜欢的棋子是马,更具体地,他更加喜欢马所行走的方式,老W下棋时觉得无聊,便 决定加强马所行走的方式,更具体地,他有两双手,其中一双手能让马从(u,v)移动到 ( u + A x , v + A y ) (u+Ax,v+Ay) (u+Ax,v+Ay)而另一双手能让 马从 ( u , v ) (u,v) (u,v)移动到 ( u + B x , v + B y ) (u+Bx,v+By) (u+Bx,v+By)。小W看见老W的下棋方式觉得非常有趣,他开始思考一个问题:假设棋盘是个无限 大的二维平面,一开始马在原点 ( 0 , 0 ) (0,0) (0,0)上,若用老W的两种方式进行移动,他有多少种不同的移动方法到达点 ( E x , E y ) (Ex,Ey) (Ex,Ey)呢?两种移动方法不同当且仅当移动步数不同或某一步所到达的点不同。老W听了这个问题,觉得还不够有趣,他 在平面上又设立了n个禁止点,表示马不能走到这些点上,现在他们想知道,这种情况下马有多少种不同的移动方法呢?答案数可能很大,你只要告诉他们答案模 ( 1 0 9 + 7 ) (10^9+7) (109+7)的值就行。

输入格式

第一行三个整数 E x , E y , n Ex,Ey,n Ex,Ey,n分别表示马的目标点坐标与禁止点数目。
第二行四个整数 A x , A y , B x , B y Ax,Ay,Bx,By Ax,Ay,Bx,By分别表示两种单步移动的方法,保证 A x ∗ B y − A y ∗ B x ≠ 0 Ax*By-Ay*Bx \neq 0 AxByAyBx=0
接下来n行每行两个整数Sxi,Syi,表示一个禁止点。

输出格式

仅一行一个整数,表示所求的答案。

数据规模

∣ A x ∣ , ∣ A y ∣ , ∣ B x ∣ , ∣ B y ∣ < = 500 , 0 < = n , E x , E y < = 500 |Ax|,|Ay|,|Bx|,|By| <= 500, 0 <= n,Ex,Ey <= 500 Ax,Ay,Bx,By<=500,0<=n,Ex,Ey<=500

分析

设从 ( 0 , 0 ) (0,0) (0,0)走到 ( E x , E y ) (Ex,Ey) (Ex,Ey)的过程中,用一双手 ( A x , A y ) (Ax,Ay) (Ax,Ay)走了 i i i步,另一双手 ( B x , B y ) (Bx,By) (Bx,By)走了 j j j步。
{ A x ∗ i + B x ∗ j = E x A y ∗ i + B y ∗ j = E y \begin{aligned} \begin{cases} Ax*i+Bx*j=Ex \\ Ay*i+By*j=Ey \end{cases}\end{aligned} {Axi+Bxj=ExAyi+Byj=Ey
因为题目保证 A x ∗ B y − A y ∗ B x ≠ 0 Ax*By-Ay*Bx \neq 0 AxByAyBx=0,所以,方程如果有解,则一定有唯一整数解。可以求出 i , j i,j i,j.
如果不考虑障碍点,则方案数为 C ( i + j , j ) C(i+j,j) C(i+j,j)
现在考虑障碍点,则可以使用容斥原理。
答案为所有方案-经过1个障碍点的方案数+经过2个障碍点的方案数……
但这是指数级的容斥,显然不行。
注意到关键点(起点和终点及障碍点)可以构成一个有向无环图。
可以将关键点排序,然后设 f [ i ] f[i] f[i]表示从起点不经过任何障碍点到达i的方案数, g [ i ] [ j ] g[i][j] g[i][j]表示从关键点i到达关键点j的无限制的方案数。
f [ i ] = g [ 0 ] [ i ] − ∑ j = 1 i − 1 f [ j ] × g [ j ] [ i ] f[i] = g[0][i] - \sum\limits_{j=1}^{i-1} f[j] \times g[j][i] f[i]=g[0][i]j=1i1f[j]×g[j][i]

准确来讲,上式不是容斥原理,而是将经过障碍点的方案巧妙的分类,将时间复杂度降为了O(N^2)

3 卡特兰数列

卡特兰数的基本性质

卡特兰数一般用于计算组合方式的多少,它针对某一类排列组合问题。

通项公式

​ 递推公式:

h ( n ) = h ( 0 ) h ( n − 1 ) + h ( 1 ) h ( n − 2 ) + . . . + h ( n − 1 ) h ( 0 ) h(n) = h(0)h(n-1)+h(1)h(n-2)+...+h(n-1)h(0) h(n)=h(0)h(n1)+h(1)h(n2)+...+h(n1)h(0)

​ 其中h(0) = h(1) = 1。

​ 上式可以简化成:(简化公式不方便理解,但方便编程,所以本文只考虑递推公式)

h ( n ) = 1 n + 1 C 2 n n h(n)=\frac{1}{n+1}C^n_{2n} h(n)=n+11C2nn

h ( n + 1 ) = 1 n + 2 C 2 n + 2 n + 1 h(n+1)=\frac{1}{n+2}C^{n+1}_{2n+2} h(n+1)=n+21C2n+2n+1

通项公式的理解

​ 固定某一个,可以将n分成两半,遍历固定n个元素,可以将总统计数分成n份,n份排列组合数相加就得总数。

​ 对于单份,我们将两半的数量固定,则在计算单份的排列组合时,要分别计算两半的排列组合,再将两半的排列组合数相乘,就得该单份的排列组合数。

卡特兰数应用问题的共性

​ 如果问题的规模是n,我们可以将问题通过固定一个元素分解成n个子问题,而且每个子问题还可以分解成两个子问题。

h ( n ) = 1 n + 1 C 2 n n h(n)=\frac{1}{n+1}C^n_{2n} h(n)=n+11C2nn

​ 首先,这个公式可以通过 h ( n ) = h ( 0 ) h ( n − 1 ) + h ( 1 ) h ( n − 2 ) + . . . + h ( n − 1 ) h ( 0 ) h(n) = h(0)h(n-1)+h(1)h(n-2)+...+h(n-1)h(0) h(n)=h(0)h(n1)+h(1)h(n2)+...+h(n1)h(0) 使用展开式推出来,这好像是高中的知识,有点忘了。我们还有回到数形结合法吧(折线法)。

img

​ 例1:求从原点(0,0)出发,第一步只能往上走,且往下走n次,往下走n次,要求路径不能通过第4象限,求到达点(2n,0)的路径数。

​ 分析:至于这个路径为什么是卡特兰数,请求参考下文中的例子2.4,2.5,2.6这三个例子。

​ (1)如果没有“路径不能通过第4象限”这个要求,我们可以得到的总路径数是 C 2 n n C^n_{2n} C2nn。这是简单的排列组合,有2n个位置,取出n个位置放向上走的操作,剩下的n个位置是向下走。

​ (2)主要是要求不满足条件的路径数。不满足条件的路径有什么特点呢?特定是:经过第四象限的路径必然会与 y = -1这条直线相交。

​ (3)我们对每条不满足条件的路径,找到它与y=-1相交的第一个点,记为点P,然后将该路径在点P之后的线作关于y=-1对称的折线,新作出来的折线如图中的红线,我P点之前的折线构成一条从点(0,0)到点(2n,-2)的路径。

​ (4)每条不满足条件的路径都能通过步骤3的方法作出一条从点(0,0)到点(2n,-2)的路径 , 这些从(0,0)到(2n,-2)的路径都满足条件往下走总比往上走多两次。

​ (5)这样,我们就能通过求从点(0,0)到点(2n,-2)的路径数,得到不满足路径数,即 C 2 n n − 1 C^{n-1}_{2n} C2nn1

​ (6)这里其实还有点难理解,拿每条不满足的路径都可以生成一条从点(0,0)到点(2n,-2)的路径,那就能说明不满足条件路径数就等于从点(0,0)到点(2n,-2)的路径数吗?显然好像还缺一个反推理,即我们把每条从点(0,0)到点(2n,-2)的路径,通过步骤(3)的方式变换,也能得到一条不满足条件的路径。这样才能说明是一 一对应的。

​ (7)

h ( n ) = C ( 2 n , n ) − C ( 2 n , n − 1 ) = 1 n + 1 C 2 n n h(n)=C(2n,n) - C(2n, n-1) = \frac{1}{n+1}C^n_{2n} h(n)=C(2n,n)C(2n,n1)=n+11C2nn

应用例子及理解

n个结点构成的不同二叉树的数量

​ 分析:

​ (1) 设:h(n) 表示n个节点组成的不同二叉树的数量;

​ (2)我们选择第一个节点当根节点,第一个节点左边的节点(0个节点)组成左子树,第一个节点右边的节点(n-1个节点)组成右子树,则如果我们选择第一个节点当树节点,那么,我们得到的不同的二叉树的数量为h(0)h(n-1);

​ (3)同理我们选择第二个节点当根节点得到的不同的二叉树的数量分h(1)h(n-2);

​ (4)我们分别让第1,2,…,n个节点当根节点,得到不同的二叉树总数就是

h ( n ) = h ( 0 ) h ( n − 1 ) + h ( 1 ) h ( n − 2 ) + . . . + h ( n − 1 ) h ( 0 ) h(n) = h(0)h(n-1)+h(1)h(n-2)+...+h(n-1)h(0) h(n)=h(0)h(n1)+h(1)h(n2)+...+h(n1)h(0)

矩阵相乘 ,不同的加括号方法
a 1 × a 2 × ⋯ × a n + 1 a_1 \times a_2 \times \dots \times a_{n+1} a1×a2××an+1

​ 分析:

​ (1)我们先找出元素,这里的元素是指乘法运算符。

​ (2)设:h(n)表示有n个乘号的运算式的运算顺序数量。

​ (3)我们选择第一个乘号做为最后一个作运算的,则我们需要将该乘号两边的式子用括号括起来。该乘号左边有0个乘号,则左边式子的运算顺序数为h(0),同理右边有n-1个乘号,右边式子的运算顺序数有h(n-1),则当我们选择第一个乘号作为最后的运算符时,整个式子的运算顺序数有h(0)h(n-1);

​ (4)同理,如果我们选择第二个乘号作为最后一个运算符,那么式子的运算顺序数为h(1)h(n-2);

​ (5)我们分别让第1,2,…,n个乘号当最后一个运算符,那么,得到不同的运算顺序数为

h ( n ) = h ( 0 ) h ( n − 1 ) + h ( 1 ) h ( n − 2 ) + . . . + h ( n − 1 ) h ( 0 ) h(n) = h(0)h(n-1)+h(1)h(n-2)+...+h(n-1)h(0) h(n)=h(0)h(n1)+h(1)h(n2)+...+h(n1)h(0)

求一个凸多边形区域划分成三角形区域的方法数?

img

​ 分析:我们用一种方法把一个n+3条边的凸分成三角形,我们需要n条边。

​ (1)在这里,我们的元素是:用一种方法从一个角出发连接其它所有角需要n条边,这n条边就是元素。

有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少种排队方法使得只要有10元的人买票,售票处就有5元的钞票找零?

​ 分析:我们先找一种排列,满足条件。这种排列为:5,10,5,10,…,5,10,即每个5元之后跟着一个10元就行了。

​ (1)这里,我们取一个(5,10)对当作分割元素,显然分割出来的两半,都有5元个数等于10元个数。

n*n的方格地图中,从一个角到另外一个角,不跨越对角线的路径数

img

​ 分析:这个题目我是借助2.4这个场景理解的。证明这个路径数是卡特兰数之前,我们要做一个转换。

​ (1)通过分析题目,我们发现,从左下角走到右上角,需要走2n步,并且需要向右走n步,向上走n步,走的过程中,我们要保持向右走的次数大于等于向上走的次数。

​ (2)这不就是5元的个数必须大于10元的个数吗?!

一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?

​ 分析:这个题目还得借助5元10元!!!。入栈是个5元,出栈是个10元,永远要保持入栈大于等于出栈!!!

4 斯特林数

斯特林数,即Stirling数,出现在许多组合枚举问题中。第一类Stirling数, s ( n , m ) s(n,m) s(n,m),也可记为 [ n m ] \begin{bmatrix} n \\m \end{bmatrix} [nm],表示将 n 个不同元素构成m个圆排列的数目。 第二类斯特林数, S ( n , m ) S(n,m) S(n,m), 也可记作 { n m } \begin{Bmatrix} n \\ m \end{Bmatrix} {nm},其表示将n个不同的元素分成m个集合的方案数。

第一类斯特林数,解决的是这样的问题:

n个不同的小球放入m个相同的盒子中,放入每个盒子中的小球构成一个环,问有多少种不同的方案?

考虑第n个小球,它有两种情形:

1).如果它单独放入一个盒子中,则此种情形的方案数为 s ( n − 1 , m − 1 ) s(n-1,m-1) s(n1,m1)种。

2).如果它与之前的小球共用一个盒子,那么它可以放入前面任一小球的前一个位置,这种情形有 ( n − 1 ) ∗ s ( n − 1 , m ) (n-1)*s(n-1,m) (n1)s(n1,m)

所以,可以得到下列递推式:

s ( n , m ) = s ( n − 1 , m − 1 ) + ( n − 1 ) ∗ s ( n − 1 , m ) s(n,m)=s(n-1,m-1)+(n-1)*s(n-1,m) s(n,m)=s(n1,m1)+(n1)s(n1,m)

第二类斯特林数,即是我们前面讲过的集合的划分。

考虑第n个小球,

1).如果它单独放入一个盒子中,则此种情形的方案数为 S ( n − 1 , m − 1 ) S(n-1,m-1) S(n1,m1).

2).如果它和之前的小球共用一个盒子,而同一个盒子中的小球是不考虑顺序的,所以,这种情形有:

m ∗ S ( n − 1 , m − 1 ) m*S(n-1,m-1) mS(n1,m1).

所以,它的递推式如下:

S ( n , m ) = S ( n − 1 , m − 1 ) + m ∗ S ( n − 1 , m ) S(n,m)=S(n-1,m-1)+m*S(n-1,m) S(n,m)=S(n1,m1)+mS(n1,m)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值