这一章节讲的主要是组合数学方面的知识,涉及到的知识点有:
1.计数原理
2.稳定婚姻问题
3.组合问题分类
4.排列
5.组合
6.母函数
7.莫比乌斯反演
8.Lucas定理
其中母函数与莫比乌斯反演较难,省选可能会考到,大多数题目都有很多的技巧,但题型都是差不多的.一般分为4类:1.存在性问题.2.计数性问题.3.构造性问题.4.最优化问题.解一道组合题的大致步骤就是先想到比较直观的做法,复杂度可能非常高,再逐步优化,用数学化的语言来把问题给抽象化:dp.如果还能继续优化,那么就是数学公式表达了.
一、计数原理
1.抽屉原理 2.加法原理(分类思想) 3.乘法原理(分步思想) 4.容斥原理.
二、稳定婚姻问题
有若干个男子和若干个女子要相亲,男女之间必须配对.每个男子和女子心中都有一个异性人的排名,它们都想和自己心中排名高的人结婚,但是不允许两个人结婚,这两个人中有一个人心中排名比当前另一半高的人的另一半比这个人的排名低,问有没有方案满足上述条件.
这种问题有个固定的解法:Gale-Shapley算法:每一轮男子追求没有拒绝过他的最中意的女子.女子将从向他表白的人中选一个最中意的人作为男朋友,如果已经有男朋友并且比这个人差,就把它刷掉,直到所有人配对完成.最终的结果是男子都找到了最满意的目标,女子找到的可能是最差的目标.
三、排列:传送门
四、组合
组合光是知道概念没有很大的用处,关键是做题.
例1:某班有10名同学,其中有4名女同学。要在班级选出3名学生参加座谈会,其中至少有1名女同学,求方案数.
分析:总的方案数为C(10,3)=120,不选女同学的方案数为C(6,3)=20,满足要求的方案数为C(10,3)-C(6,3)=100
例2:仅含有数字1和0的10位正整数中,能被11整除的数有多少个?
分析:一个结论:当一个正整数奇位上数字和与偶位上数字和之差为11的倍数时,就被11整除.
设满足要求的10位正整数n=1a8a7a6a5a4a3a2a1a0,那么P=a8+a6+a4+a2+a0,Q=1+a7+a5+a3+a1. 11 | P-Q并且|P-Q| ≤ 5,所以P=Q=K.
那么P中就要有K个1,Q中就要有k-1个1,方案数就是
C(5,1)*C(4,0) + C(5,2)*C(4,1) + C(5,3)*C(4,2) + C(5,4)*C(4,3) + C(5,5)*C(4,4)=126.
例3:堆塔问题
设有n个边长为1的正方体,在一个宽为1的轨道上堆塔,但塔本身不能分离。堆塔的规则为底层必须有支撑,右图的两种堆法都是不合法的.输入n(n ≤ 40),求两个问题:1.总共有多少种不同的方案? 2.堆成k层的方案数各是多少?
分析:因为每一层下面都必须要有堆的,所以不能从层来考虑,要从列来考虑.
对于第一问,设一共堆了k列,第i列堆了xi个,那么x1+x2+......+xk = n,可以联想到隔板法求方案数,只是这里的xi≥1,每个xi都要减1,那么原方程就变成了x1+x2+......+xk=n-k,方案数就是C(n-k+k-1,k-1) = C(n-1,k-1),枚举k,可以得到最终的答案:2^(n-1).
对于第二问,每一列就是一个状态.设f[i][j][k]表示用了i个正方体,堆了j层,最后一列的高度为k的方案数,那么f[i][j][k]可以转移到3个不同的状态:f[i+1][j+1][k+1] (j == k),f[i+1][j][k+1] (j != k),f[i+1][j][1](新放一列).
五、母函数
母函数其实就是借助函数来计数,通常不关心它的结果,只关心它的项的系数.
定义:给定数列a0,a1,...,an,...,构造一个函数F(x) = a0f0(x) + a1f1(x) +...+anfn(x) +...,称F(n)为函数a0,a1,...,an,...的母函数.一般的母函数fi(i) = x^i.母函数非常地抽象,不是很好理解,需要不断做题来强化概念.
例4:有重量为1,3,5(克)的砝码各两个,问:1.可以称出多少种不同重量的物品?2.若要称出重量为7克的物品,所使用的砝码有多少种本质上不同的情况?
分析:构造母函数F(x) = (1+x+x^2)(1+x^3+x^6)(1+x^5+x^10) = 1+x+x^2+x^3+x^4+......+x^18,因为一共有18种不同的次数,所以可以称出18种不同重量的物品,x^7前面的系数为2,所以有2种本质不同的方案.
总结:一般而言,要统计i的方案数,即求式子中f(i)前面的系数是多少.
下面是几个常见的母函数,一般是化简用:
1/(1-x) = 1+x+x^2+x^3+......
1/(1-x)^2 = 1+2x+3x^2+......
例5:求n位十进制正数中出现偶数个5的数的个数.
分析:三种方法.
1.数位dp,比较简单直观的做法.
2.递推,设ai表示i位十进制数中出现偶数个5的数的个数,bi表示i位十进制数中出现奇数个5的数的个数,递推式子很显然,如果i+1位十进制数要有偶数个5的,那么肯定是原有的有偶数个5的数在末尾加上一个不是5的数,有9种选择,或者在原有的有奇数个5的数的末尾加上一个5,有1种选择,那么ai = 9*ai-1 + bi-1 bi = 9b-1+ai-1.
3.母函数,通过递推可以得到an - 9an-1 - bn-1 = 0,bn - 9bn-1 - an-1 = 0.构造母函数A(x) = a1+a2x+a3x^2+......+anx^(n-1).
B(x) = b1+b2x+b3x^2+......+bnx^(n-1).通过化简可以得到A(x) = (-71x+8)/((1-8x)(1-10x)),B(x) = (1-x)/((1-8x)(1-10x)).
因为要求an,考虑A(x),一个常见的变形:A/BC ---> X/B + Y/C,那么A(x) = (7/(1-8x) + 9/(1-10x))/2,变形完后一定要将分式的形式转化为Σ的形式:(Σ7*(8x)^n + Σ9*(10x)^n)/2,最终要求x^n前面的系数,那么答案就是(7*8^(n-1))/2 + (9*10^(n-1))/2.
总结:1.要先根据题目得到一些式子,再设出母函数. 2.变形母函数,化成分式形式,在分式的基础上变形. 3.将分式形式化成Σ形式,求x^n前面的系数即为答案.一些经典变形例如 A/BC ---> X/B + Y/C要记住.
上面介绍的是普通的母函数,还有一种指数型母函数能用来解决多重集合的组合问题.
指数型母函数一般的形式是:1+x+x^2/2!+x^3/3!+x^4/4!+...+x^n/n!+... = e^x.化简成分式一般需要用到e^x的Taylor展开式.还有另外的几个:(e^x+e^-x)/2 = 1+x^2/2! + x^4/4! + ... + x^2n/(2n)! + ...
(e^x-e^-x)/2 = x + x^3/3! + x^5/5! + ... + x^(2n+1)/(2n+1)! + ...
例6:设有6个数字,其中三个数字1,两个数字6,一个数字8,问能组成多少个四位数?
分析:构造母函数G(x) = (1+x+x^2/2! + x^3/3!) * (1+x+x^2/2!) * (1+x),化简,得到x^4/4!前面的系数为38,所以答案为38.
例7:求1,3,5,7,9这5个数字组成的n位数个数,要求其中3和7出现的次数为偶数,其它数字出现的次数无限制.
分析:构造母函数:G(x) = (1 + x^2/2! + x^4/4! +...)^2 * (1 + x/1! + x^2/2! + x^3/3! +...)^3
化简成分式,可以得到:G(x) = ((e^x+e^-x)^2 * e^3x)/4,化简可以得到G(x) = 1/4 * (e^5x + 2*e^3x + e^x).
变成Σ形式,可以得到:G(x) = 1/4*Σ(5^n + 2*3^n + 1)*x^n/n!,答案就是1/4 * (5^n + 2*3^n + 1).
例8:传送门
例9:传送门
关于母函数推荐去听学堂在线THU的组合数学课.
六、Lucas定理
挺简单的一个结论,主要用于解决大组合数取模,C(n,m)%p,p是一个素数,在10^5以内并且小于n,m.
例10:传送门
例11:传送门
七、莫比乌斯反演
比较难的一个知识点,技巧非常之多,体现在公式的表达上和变形上.
例12:传送门
例13:传送门
例14:传送门
例15:传送门
例16:传送门
例17:传送门
通过对上述题目的分析,可以发现一些规律:一般来说,要用到莫比乌斯反演的题最终都与gcd有关,而莫比乌斯反演能够非常好地降低复杂度,下面是一些常见的套路:
1.求gcd(i,j)=k的个数:gcd(i,j)=1的个数比较好求,利用莫比乌斯反演得到答案ans = μ(d) * F(i),F(i)为gcd(x,y) = i且i|d的数的个数.如果规定了i,j的上限,那么F(i) = (n/i) * (m/i),下取整.ans就很容易求出来了.那么gcd(i,j)=k怎么处理呢?i,j,k同时除以k就可以了.
2.一般解题要用到莫比乌斯反演的第二种形式,即倍数形式.若出现两个乘积的形式:pd,且枚举了p和d,那么可以设T=pd,p和d都可以用T表示出来,从1到maxn枚举T,再枚举T的约数.这样就可以用到根号算法.
3.式子中出现下取整符号记得用上根号算法,即每次枚举除法的结果,必要条件是出现下取整符号和能快速求出前缀和!
4.将枚举倍数的放在前面,枚举约数的放在后面,方便用根号算法,例如:
--->
5.式子中出现gcd,可以枚举gcd,如果gcd的限制不为1,那么可以强行令gcd的限制为1,得到答案后转化到原来的限制上.常见的处理方法就是gcd(i,j) = d,i,j,d都除以d,还原的时候式子中有多少与d有关,就要乘上多少与d有关的式子.bzoj2154就是一个很好的例子.
6.线性筛可以利用积性函数的性质来快速求得前缀和,一般在n不是特别大的情况下可以采用每个数向倍数扩展来预处理.
7.一般将约数转化为倍数算法的效率更高.
8.改变Σ的枚举范围,将结构相同的部分放在一起,能使得式子中出现分式,从而可以用根号算法.
八、习题:
1:传送门
2:传送门
3:传送门
4:传送门
5:传送门
6:传送门