【学习笔记】组合数学

1. 插板法

插板法是解决「相同元素分配」问题的经典技巧,核心是用「隔板」把元素分成若干组。

① 不相邻排列(不相邻组合)

问题:从 \(n\) 个位置中选 \(k\) 个,要求两两不相邻。
公式:方案数为

\[\binom{n-k+1}{k} \]

推导思路:先放 \(n-k\) 个「非选中元素」,它们之间形成 \(n-k+1\) 个空隙(包括两端),再把 \(k\) 个「选中元素」插入这些空隙中,保证不相邻。

② 多重集组合数

问题:从多重集 \(\{n_1\cdot a_1,n_2\cdot a_2,\dots,n_k\cdot a_k\}\) 中选 \(r\) 个元素的方案数。

  • 无上限时(\(n_i \ge r\)):用插板法,公式为 \(\displaystyle\binom{r+k-1}{k-1}\)
  • 有上限时:需要结合容斥原理求解。

2. 二项式(多项式)定理

二项式定理:

\[(a+b)^n=\sum_{k=0}^{n} \binom{n}{k} a^{n-k} b^k \]

多项式定理(拓展):

\[(x_1+x_2+\cdots+x_m)^n=\sum_{\substack{k_1+k_2+\cdots+k_m=n}} \frac{n!}{k_1!k_2!\cdots k_m!} x_1^{k_1}x_2^{k_2}\cdots x_m^{k_m} \]

3. 圆排列

圆排列和直线排列的区别在于:圆排列中旋转后相同的排列视为同一种。

\(n\) 个不同元素的圆排列数:

\[Q_n^n=\frac{A_n^n}{n}=(n-1)! \]

\(n\) 个不同元素中取 \(r\) 个的圆排列数:

\[Q_n^r=\frac{A_n^r}{r}=\frac{n!}{r\cdot(n-r)!} \]

4. 二项式推论(常用恒等式)

① 吸收恒等式

\[k\binom{n}{k}=n\binom{n-1}{k-1} \]

常用于递推或化简求和式。

② 组合数递推公式(杨辉三角)

\[\binom{n}{m}=\binom{n-1}{m}+\binom{n-1}{m-1} \]

③ 二项式系数和

所有二项式系数和:

\[\sum_{i=0}^{n} \binom{n}{i}=2^n \]

\((1+1)^n\) 展开直接得到。

交错和:

\[\sum_{i=0}^{n} (-1)^i \binom{n}{i}=(1-1)^n=0 \quad (n>0) \]

\(n=0\) 时结果为 \(1\)

④ 范德蒙德卷积

\[\sum_{i=0}^{k} \binom{n}{i}\binom{m}{k-i}=\binom{n+m}{k} \]

特殊形式(对称和):

\[\sum_{i=0}^{n} \binom{n}{i}^2=\binom{2n}{n} \]

⑤ 含 \(i\) 的求和(导数法)

\((x+1)^n\) 两边求导后令 \(x=1\)

\[\sum_{i=0}^{n} i\binom{n}{i}=n\cdot 2^{n-1} \]

⑥ 含 \(i^2\) 的求和

再次求导或用恒等式推导:

\[\sum_{i=0}^{n} i^2 \binom{n}{i}=n(n+1)\cdot 2^{n-2} \]

5. 二项式反演

常用于「用至少 / 至多的计数求恰好的计数」,核心公式:

\[g(n)=\sum_{i=0}^{n} \binom{n}{i}f(i) \]

则:

\[f(n)=\sum_{i=0}^{n} (-1)^{n-i} \binom{n}{i}g(i) \]

6. 抽屉原理(鸽巢原理)

基本形式:\(n\) 个物品放入 \(k\) 个抽屉,至少有一个抽屉里有 \(\displaystyle\left\lceil \frac{n}{k} \right\rceil\) 个物品。
应用场景:证明存在性问题、求「最坏情况」下的最小数量。

7. 容斥原理

【学习笔记】容斥原理

8. 斐波那契数列

通项公式(比内公式):

\[F_n=\frac{1}{\sqrt{5}}\left[\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n\right] \]

常用性质

递推关系:

\[F_n=F_{n-1}+F_{n-2} \quad (n\ge2),\ F_0=0,\ F_1=1 \]

组合数表示:

\[F_n=\sum_{k=0}^{\lfloor n/2 \rfloor} \binom{n-k}{k} \]

模周期性(皮萨诺周期):斐波那契数列模 \(m\) 会出现周期循环。

9.错排

问题:\(n\) 个元素的排列中,没有任何元素出现在其原来位置上的排列数。

递推公式:

\[D_n=(n-1)(D_{n-1}+D_{n-2}),\ D_1=0,\ D_2=1 \]

通项公式:

\[D_n=n!\left(1-\frac{1}{1!}+\frac{1}{2!}-\frac{1}{3!}+\cdots+(-1)^n \frac{1}{n!}\right) \]

10.prufer序

公式

  • Cayley 公式:有标号⽆根树的数量为 \(n^{n-2}\) ,有标号有根树的数量为 \(n^{n-1}\)

  • 洛⾕P2290 [HNOI2004] 树的计数:指定度数序列为 \(d_1,d_2,d_3..,d_n\) 的⽆根树数量是 \(n-2 \choose {d_1-1,d_2-1,...,d_n-1}\)

  • 图联通方案:⼀张有 \(k\) 个连通块的图,第 \(i\) 个连通块⼤⼩为 \(a_i\) ,求连接 \(k-1\) 条边使得图连通的⽅案数为 \((\sum a_i^{k-2})\Pi a_i\)。(数学推导)

  • 扩展 Cayley 公式:\(n\) 个有标号结点形成 \(s\) 棵树的森林且 \(1,2,...,s\) 不属于同⼀棵树的⽅案数为 \(sn^{n-s-1}\)

树与序的双射构建

P6086

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e6+10;
int f[N];
int p[N];
int n;
int d[N];
void solve1(){
	for(int i=1;i<=n-1;i++){
		cin>>f[i];
		d[f[i]]++;
	}
	for(int i=1,j=1;i<=n-2;i++,j++){
		while(d[j]) j++;p[i]=f[j];
		while(i<=n-2&&!(--d[p[i]])&&p[i]<j) p[i+1]=f[p[i]],i++; 
	}
	int ans=0;
	for(int i=1;i<=n-2;i++) ans^=i*p[i];
	cout<<ans<<"\n";
}
void solve2(){
	for(int i=1;i<=n-2;i++){
		cin>>p[i];
		d[p[i]]++;
	}p[n-1]=n;
	for(int i=1,j=1;i<n;i++,j++){
		while(d[j]) j++;f[j]=p[i];
		while(i<n&&!(--d[p[i]])&&p[i]<j) f[p[i]]=p[i+1],i++;
	}
	int ans=0;
	for(int i=1;i<n;i++) ans^=i*f[i];
	cout<<ans<<"\n";
}
signed main(){
	int m;cin>>n>>m;
	if(m==1) solve1();
	else solve2();
	return 0;
}
//指针维护最小值

11.矩阵树定理

无向

定义⼀张⽆向图 的 Laplace 矩阵 \(L_G\) 为度数矩阵减去邻接矩阵,那么其⽣成树个数为任意选取⼀个 \(i\)\(L_G\) 去除第 \(i\)\(i\) 列后矩阵的⾏列式。

有向拓展

假设现在给定一个图G.

度数矩阵D:若存在边 \((x,y,z)\) ,则 外向树中 \(D[y][y]+=z\); 内向树中 \(D[x][x]+=z\);

邻接矩阵C:若存在边 \((x,y,z)\) ,则 内向树和外向树中均为 \(C[x][y]+=z\);

图G的基尔霍夫矩阵 \(A = D − C\)

加权拓展

那么矩阵树定理求的就是边权乘积之和,此时点的度数为连边权值和

posted @ 2026-08-21 16:49  Aistyr  阅读(35)  评论(0)    收藏  举报