组合数学
数学
组合数学的常见式子
定义式
表示从 \(n\) 个不同元素中选出 \(m\) 个(不计顺序)的方案数。
一些应用
插板法:
1.有 \(n\) 个完全相同的元素,将其分为 \(k\) 组,每组至少有一个元素,一共有多少种分法?(sol:在 \(n-1\) 个空格中放 \(k-1\) 块板)
2.有 \(n\) 个完全相同的元素,将其分为 \(k\) 组,每组可以为空,一共有多少种分法?(sol:每一组加一个数,共 \(n+k\) 个数,然后用上一题解决)
3.从\(1, 2, · · · , n\) 中选出 \(k\) 个数,要求任何两个数都不相邻,一共有多少种选法?
sol: 选择 \(k\) 个数会分成 \(K+1\) 段,设每段包含的数的个数为 \(a_0,a_1,a_2,...\) 则满足
所以给 \(a_0,a_{k+1}\) 加两个数,则变成问题1,从 \(n-k+2\) 个数中每组至少有一个元素分为 \(k+1\) 组的分法。
递推式
证明(组合意义):
同学和老师出去春游共有 \(n\) 个人,一项活动只能去 \(m\) 个人,考虑老师去或不去,老师去在 \(n-1\) 个同学中选 \(m-1\) 个,否则在 \(n-1\) 个同学中选 \(m\) 个。
特征:
加号连接,两个组合数的 \(n\) 相同, \(m\) 相差1。
对称性
对于\(n,m\in Z\)
证明(组合意义):
从 \(n\) 个数中选 \(m\) 个数,等同于从 \(n\) 个数中选 \(n-m\) 个数不选。
吸收/相伴等式
最终形式:
证明:
将式子转为阶乘的形式,即可证明等式两边相等。
特征:
除号连接,分号上为 \(\binom{n}{m}\) ,分号下的 \(n\) 或者 \(m\) 减一。
上指标反转
证明:
特征:
有一个(-1)^m。
三项式系数恒等式
证明(组合意义):
\(n\) 个数选出 \(m\) 个再在 \(m\) 个中选 \(k\) ,等同与从 \(n\) 个数中选 \(k\) ,在从 \(n-k\) 中找 \(m-k\) 。(因为等式右边先选出 \(k\) 在找 \(m-k\) 与 \(k\) 一起等同于一开始选 \(m\) )
特征:
第一个组合数的 \(m\) 等于第二个的 \(n\) 。
平行求和
证明:
不断展开即可。
特征:
上下指标同时加减。
上指标求和
证明(组合意义):
\(n+1\) 个数选出 \(m+1\) 个,考虑最后一个数是第 \(i+1\) 个数,则需要从前 \(i\) 个数中选 \(m\) 个数。
特征:
有 \(\sum\) 以及上指标变化,下指标不变
下指标求和(整行)
证明(组合意义):
\(n\) 个数中任选出 \(0\) 到 \(n\) 个数等于 \(n\) 个数的所以子集,每个数可选可不选,所以共2^n种可能。
特征:
有 \(\sum\) 以及下指标变化,上指标不变
交错和
证明:
下指标卷积
证明(组合意义):
\(n\) 个数中选出 \(i\) 个数 从 \(m\) 个数中选 \(k-i\) 个数,等于在 \(n+m\) 个数中选 \(k\)。
特征:
有 \(\sum\) 以及下指标的和不变,上指标不变
上指标卷积
证明(组合意义):
\(n\) 个数分成左右两边,左边 \(a\) 中选出 \(i\) 个数 , 右边从 \(b\) 个数中选 \(n-i\) 个数,等于给原数加一个分隔符,从 \(n+1\) 个数中选 \(a+b+1\)。
特征:
有 \(\sum\) 以及下指标的和不变,上指标不变
范德蒙德卷积
证明(组合意义):
\(n\) 个数分成左右两边,左边 \(r\) 个数 中选出 \(k\) 个数 , 右边 \(s\) 个数中选 \(n-k\) 个。
练习题
1.
2.
给 \(q\) 组询问,每次给出 \(n\) , \(m\) ,求 \(\sum_{i=0}^{m}\binom{n}{i}\)
q, n, m ≤ 105,对 1e9 + 7 取模。
1.当已知 \(\sum_{i=0}^{m}\binom{n}{i}\)求 \(\sum_{i=0}^{m}\binom{n+1}{i}\)时,因为
以下面的表格为例,第3行等于第2行加第1行.(第一行和第二行的和均为\(\sum_{i=0}^{m}\binom{n}{i}\),第三行的和为\(\sum_{i=0}^{m}\binom{n+1}{i}+\binom{n}{m}\))
\(\binom{n}{0}\) | \(\binom{n}{1}\) | \(\binom{n}{2}\) | \(\binom{n}{3}\) | |
---|---|---|---|---|
\(\binom{n}{0}\) | \(\binom{n}{1}\) | \(\binom{n}{2}\) | \(\binom{n}{3}\) | |
\(\binom{n+1}{0}\) | \(\binom{n+1}{1}\) | \(\binom{n+1}{2}\) | \(\binom{n+1}{3}\) | \(\binom{n}{3}\) |
2.当已知 \(\sum_{i=0}^{m}\binom{n}{i}\)求 \(\sum_{i=0}^{m+1}\binom{n}{i}\)时
所以每一步都可以 \(o(1)\) 转移,莫队离线处理。
3.下指标点积
上指标为常数,下指标和为常数(下指标卷积)
4.
求
三项式系数恒等式
二项式定理
当且仅当, \(n==m\) 时有值,因为 \(n==m\) 时 \(\binom{n}{m}==1\),所以
5.有标号连通图计数
设 \(f_i\) 为大小为 \(i\) 个点的有标号连通图的数量,\(g_i\) 为有 \(i\) 个点的有标号图的数量。
因为任意两个点有一条边,可选可不选,所以
对于一个点在一个大小为 \(i\) 的联通块里,联通块的元素有 \(\binom{n-1}{i-1}\) 种可能,就有个数乘 \(f_i\) 种不同的连通图,剩下的点随便连,则可用 \(f_i\) 表示 \(g_i\) .
6.幼儿园篮球题
给定 \(L\) , \(T\) 次询问,每次给 \(n,m,k\) ,求 \(\sum_{i=0}^{k}\binom{m}{i}\binom{n-m}{k-i}i^L\)
补充:
Lucas定理
证明:
二项式定理\((a+b)^{2}=\sum_{i=0}^{n}\binom{n}{i}a^{n}b^{n-i}\)
因为对于任何 \(i\) 在模意义下, 只有 \(i=0\) 或者 \(p\) 时 \(\binom{p}{i}\) 有值为1.
所以 \(\left(a+b\right)^p\equiv a^p+b^p\)
考虑 \(\binom{n}{m}\) 是要求 \(\left(1+x\right)^n\) 种 \(x^m\) 的系数。
又因为
所以 \(\left(1+x\right)^{p\left \lfloor n/p \right \rfloor }\) 只有 \(x^{kp}\) 的系数 \(\left(1+x\right)^{n\bmod p}\) 只有 \(x^{0}\) 到 \(x^{p-1}\) 的系数,两个式子相乘得到的 \(x^{m}\) 的系数只有一种可能,那就是第一个式子的 \(x^{p\left \lfloor n/p \right \rfloor }\) 的系数与第二个式子的 \(x^{n\bmod p}\) 的系数。所以原命题得证.
应用
求\(n\),\(m\)极大时的组合数,一般数据要求 \(p\) 小于 1e5.
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
int t,n,m,p;
ll a[N];
ll ksm(ll x,ll y)
{
x%=p;
ll ans=1;
while(y)
{
if(y&1)ans=ans*x%p;
x=x*x%p;
y>>=1;
}
return ans;
}
ll C(int n,int m)
{
if(m>n)return 0; //防止n-m越界
return a[n]*ksm(a[m],p-2)%p*ksm(a[n-m],p-2)%p;
}
ll lucas(int n,int m)
{
if(m==0)return 1;//边界,m==0时lucas(n/p,m/p)和C(n%p,m%p)都是1。
return (lucas(n/p,m/p)*C(n%p,m%p)+p)%p;
}
int main()
{
scanf("%d",&t);
a[0]=1;
while(t--)
{
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=p;i++)a[i]=a[i-1]*i%p;
printf("%lld\n",(lucas(n+m,n)+p)%p);
}
return 0;
}
代码注意事项:
1.要开longlong
2.要判越界。
斯特林数
定义
\({n\brace k}\) 表示将 \(n\) 个元素划分为 \(k\) 个非空子集的方案数(第二类)
\({n\brack k}\) 表示将 \(n\) 个元素排成 \(k\) 个轮换*的方案数(第一类)
*轮换:环形排列(首尾相接)
\(a\)对应\(b\) ,\(b\)对应\(c\) ,\(c\)对应\(d\) ,\(d\)对应\(a\) 就是一个轮换 \([a,b,c,d]\) 。
有定义可知
同时我们发现一个 \(n\) 轮换对应 \(n!\) 个的 \(n\) 排列中的 \(n\) 个 ,所以有
我们知道一个有 n 个元素的排列和一个 n 个元素的置换一一对应,于是对所有置换 中的轮换个数求和,有】
与幂之间的关系
反转公式(没懂)
反演半家桶
二项式反演
斯特林反演
卡特兰数
表达式
对应问题:
-
有一个大小为 \(n × n\) 的方格图,左下角为 \((0, 0)\) 右上角为 \((n, n)\),从左下角开始 每次都只能向右或者向上走一单位,不走到对角线 y = x 上方(但可以触碰) 的情况下到达右上角有多少可能的路径?
-
在圆上选择 \(2n\) 个点,将这些点成对连接起来使得所得到的 \(n\) 条线段不相交的 方法数?
-
一个栈的进栈序列为 1, 2, 3, · · · , n 有多少个不同的出栈序列?
-
\(n\) 个结点可构造多少个不同的二叉树?
-
\(n\) 对括号能组成的括号序列数?
-
……
通项公式
递推式
容斥
普通
Min-Max 容斥
可以套期望。
通常与FWT/FMT 结合
子集和
点击查看代码
for(int i=0;i<n;i++)//枚举位
for(int j=0;j<(1<<n);j++)//枚举集合
if(j&(1<<i)) f[j]+=f[j^(1<<i)];//这一位为1
ff