组合数学
组合数学的常见式子
递推式
证明(组合意义):
同学和老师出去春游共有 \(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-1\) 个数,等于给原数加一个分隔符,从 \(n+1\) 个数中选 \(a+b+1\)。
特征:
有 \(\sum\) 以及下指标的和不变,上指标不变
练习题
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.要判越界。