组合数学

数学

组合数学的常见式子

定义式

Cnm=(nm)=n!m!(nm)!=nmm!

表示从 n 个不同元素中选出 m 个(不计顺序)的方案数。

一些应用

插板法:

1.有 n 个完全相同的元素,将其分为 k 组,每组至少有一个元素,一共有多少种分法?(sol:在 n1 个空格中放 k1 块板)

(n1k1)

2.有 n 个完全相同的元素,将其分为 k 组,每组可以为空,一共有多少种分法?(sol:每一组加一个数,共 n+k 个数,然后用上一题解决)

(n+k1k1)=(n+k1n)

3.从1,2,···,n 中选出 k 个数,要求任何两个数都不相邻,一共有多少种选法?

sol: 选择 k 个数会分成 K+1 段,设每段包含的数的个数为 a0,a1,a2,... 则满足

a0+a1+...+ak+1=nk(a0,ak+1>0,a1...>1)

所以给 a0,ak+1 加两个数,则变成问题1,从 nk+2 个数中每组至少有一个元素分为 k+1 组的分法。

(nk+1k)

递推式

(nm)=(n1m1)+(n1m)

证明(组合意义):

同学和老师出去春游共有 n 个人,一项活动只能去 m 个人,考虑老师去或不去,老师去在 n1 个同学中选 m1 个,否则在 n1 个同学中选 m 个。

特征:

加号连接,两个组合数的 n 相同, m 相差1。


对称性

(nm)=(nnm)

对于n,mZ

证明(组合意义):

n 个数中选 m 个数,等同于从 n 个数中选 nm 个数不选。


吸收/相伴等式

(nm)(n1m1)=nmk(nk)=n(n1k1)

(nm)(n1m)=nnm(nk)(nk)=n(n1k)

(nm)(nm1)=nm+1m

最终形式:

(rk)=rk(r1k1)

证明:

将式子转为阶乘的形式,即可证明等式两边相等。

特征:

除号连接,分号上为 (nm) ,分号下的 n 或者 m 减一。


上指标反转

(nm)=(1)m(mn1m)

证明:

(nm)=n!m!(nm)!=n(n1)(n2)...(nm+1)m!

=(1)mn(n+1)(n+2)...(n+m1)m!

=(1)m(mn1m)

特征:

有一个(-1)^m。


三项式系数恒等式

(nm)(mk)=(nk)(nkmk)

证明(组合意义):

n 个数选出 m 个再在 m 个中选 k ,等同与从 n 个数中选 k ,在从 nk 中找 mk 。(因为等式右边先选出 k 在找 mkk 一起等同于一开始选 m

特征:

第一个组合数的 m 等于第二个的 n


平行求和

(n0)+(n+11)+(n+22)+....=k=0m(n+kk)=(n+m+1m)

证明:

(n+m+1m)=(n+mm)+(n+mm1)=(n+mm)+(n+m1m1)+(n+m1m2)

不断展开即可。

特征:

上下指标同时加减。

上指标求和

i=0n(im)=(n+1m+1)

证明(组合意义):

n+1 个数选出 m+1 个,考虑最后一个数是第 i+1 个数,则需要从前 i 个数中选 m 个数。

特征:

以及上指标变化,下指标不变


下指标求和(整行)

i=0n(ni)=2n

证明(组合意义):

n 个数中任选出 0n 个数等于 n 个数的所以子集,每个数可选可不选,所以共2^n种可能。

特征:

以及下指标变化,上指标不变

交错和

k=0m(1)k(nk)=(1)m(n1m)

证明:

(1)k=0m(1)k(nk)=k=0m(kn1k)(2)=(mnm)(3)=(1)m(n1m)


下指标卷积

i=0k(ni)(mki)=(n+mk)

证明(组合意义):

n 个数中选出 i 个数 从 m 个数中选 ki 个数,等于在 n+m 个数中选 k

特征:

以及下指标的和不变,上指标不变


上指标卷积

i=0n(ia)(nib)=(n+1a+b+1)

证明(组合意义):

n 个数分成左右两边,左边 a 中选出 i 个数 , 右边从 b 个数中选 ni 个数,等于给原数加一个分隔符,从 n+1 个数中选 a+b+1

特征:

以及下指标的和不变,上指标不变


范德蒙德卷积

i=0n(rk)(snk)=(r+sn)

证明(组合意义):

n 个数分成左右两边,左边 r 个数 中选出 k 个数 , 右边 s 个数中选 nk 个。


练习题

1.

i=0m(n+ii)

i=0m(n+ii)=i=0m(n+in)

=(n+m+1n+1)

(4)k(nk)2=k(nk)(nnk)(5)=(2nn)

(6)kk(nk)2=kn(nk)(n1k1)(7)=kn(nnk)(n1k1)(8)=n(2n1n1)

(9)km(mk)(nk)=km(nkmk)(nm)(10)=1(nm)km(nkmk)(11)=(n+1m)(nm)(12)=n+1nm+1

(13)k=mn(1)k(nk)(km)=k=mn(1)k(nmkm)(nm)(14)=(1)n(nm)k=mn(mk1nk)(15)=(1)n(nm)k=0nm(mn+k1k)(16)=(1)n(nm)(0nm)(17)=(1)n[n==m]

2.

q 组询问,每次给出 n , m ,求 i=0m(ni)
q, n, m ≤ 105,对 1e9 + 7 取模。
1.当已知 i=0m(ni)i=0m(n+1i)时,因为

i=0m(n+1i)=i=0m((ni)+(ni1))=2i=0m(ni)(nm)

以下面的表格为例,第3行等于第2行加第1行.(第一行和第二行的和均为i=0m(ni),第三行的和为i=0m(n+1i)+(nm)

(n0) (n1) (n2) (n3)
(n0) (n1) (n2) (n3)
(n+10) (n+11) (n+12) (n+13) (n3)

2.当已知 i=0m(ni)i=0m+1(ni)

i=0m+1(ni)=i=0m(ni)+(nm+1)

所以每一步都可以 o(1) 转移,莫队离线处理。

3.下指标点积

i=0m(ni)(mi)=i=0m(ni)(mmi)

上指标为常数,下指标和为常数(下指标卷积)

=m(n+mm)

4.

i=mn(1)i(ni)(im)

i=mn(1)i(ni)(im)=i=mn(1)i(nm)(nmim)

三项式系数恒等式

=(nm)i=mn(1)i(nmim)

=(nm)j=0nm(1)j+m(nmim)

=(1)m(nm)j=0nm(1)j(nmim)

=(1)m(nm)(1+1)(nm

二项式定理
当且仅当, n==m 时有值,因为 n==m(nm)==1,所以

=(1)m[n=m]

5.有标号连通图计数

fi 为大小为 i 个点的有标号连通图的数量,gi 为有 i 个点的有标号图的数量。
因为任意两个点有一条边,可选可不选,所以

gi=2(n2)

对于一个点在一个大小为 i 的联通块里,联通块的元素有 (n1i1) 种可能,就有个数乘 fi 种不同的连通图,剩下的点随便连,则可用 fi 表示 gi .

gi=i=1n(n1i1)figni

fi=gii=1n1(n1i1)figni

6.幼儿园篮球题

给定 L , T 次询问,每次给 n,m,k ,求 i=0k(mi)(nmki)iL
补充:

xn=i=0n{in}xi

Lucas定理

(nm)(n/pm/p)(nm)(modp)

证明:

二项式定理(a+b)2=i=0n(ni)anbni
因为对于任何 i 在模意义下, 只有 i=0 或者 p(pi) 有值为1.
所以 (a+b)pap+bp
考虑 (nm) 是要求 (1+x)nxm 的系数。

(1+x)n=(1+x)pn/p(1+x)nmodp

又因为

(1+x)pn/p=(1+xp)n/p

所以 (1+x)pn/p 只有 xkp 的系数 (1+x)nmodp 只有 x0xp1 的系数,两个式子相乘得到的 xm 的系数只有一种可能,那就是第一个式子的 xpn/p 的系数与第二个式子的 xnmodp 的系数。所以原命题得证.

应用

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.要判越界。

斯特林数

定义

{nk} 表示将 n 个元素划分为 k 个非空子集的方案数(第二类)

[nk] 表示将 n 个元素排成 k 个轮换*的方案数(第一类)

*轮换:环形排列(首尾相接)

a对应b ,b对应c ,c对应d ,d对应a 就是一个轮换 [a,b,c,d]

有定义可知

[a,b,c,d]=[b,c,d,a]=[c,d,a,b]=[d,a,b,c][a,c,b,d]

同时我们发现一个 n 轮换对应 n! 个的 n 排列中的 n 个 ,所以有

[n1]=(n1)!

我们知道一个有 n 个元素的排列和一个 n 个元素的置换一一对应,于是对所有置换 中的轮换个数求和,有】

k=0n[nk]=n!

与幂之间的关系

xn=k=0n{nk}xk=k=0n{nk}(xk)k!()xn=k=0n[nk]xk()xn=k=0n(1)nk[nk]xk()xn=k=0n{nk}(1)nkxk()xn=(1)n(x)n()

反转公式(没懂)

反演半家桶

二项式反演

gn=i=0n(ni)fifn=i=0n(ni)(1)nigigm=i=mn(im)fifm=i=0n(im)(1)imgi()

斯特林反演

卡特兰数

表达式

Hn={i=0n1HiHni1(n>=2)1(n=0,1)Hn=(2nn)(2nn1)

对应问题:

  1. 有一个大小为 n×n 的方格图,左下角为 (0,0) 右上角为 (n,n),从左下角开始 每次都只能向右或者向上走一单位,不走到对角线 y = x 上方(但可以触碰) 的情况下到达右上角有多少可能的路径?

  2. 在圆上选择 2n 个点,将这些点成对连接起来使得所得到的 n 条线段不相交的 方法数?

  3. 一个栈的进栈序列为 1, 2, 3, · · · , n 有多少个不同的出栈序列?

  4. n 个结点可构造多少个不同的二叉树?

  5. n 对括号能组成的括号序列数?

  6. ……

通项公式

Hn=(2nn)n+1

递推式

Hn=Hn1(4n2)n+1

容斥

普通

Min-Max 容斥

max(S)=TS(1)|T|1min(S)kthmax(S)=TS(1)|T|k(|t|1k1)min(T)

可以套期望。

通常与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

posted @   storms11  阅读(63)  评论(2编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示