【学习笔记】组合数学
1. 插板法
插板法是解决「相同元素分配」问题的经典技巧,核心是用「隔板」把元素分成若干组。
① 不相邻排列(不相邻组合)
问题:从 \(n\) 个位置中选 \(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. 二项式(多项式)定理
二项式定理:
多项式定理(拓展):
3. 圆排列
圆排列和直线排列的区别在于:圆排列中旋转后相同的排列视为同一种。
\(n\) 个不同元素的圆排列数:
从 \(n\) 个不同元素中取 \(r\) 个的圆排列数:
4. 二项式推论(常用恒等式)
① 吸收恒等式
常用于递推或化简求和式。
② 组合数递推公式(杨辉三角)
③ 二项式系数和
所有二项式系数和:
由 \((1+1)^n\) 展开直接得到。
交错和:
\(n=0\) 时结果为 \(1\)。
④ 范德蒙德卷积
特殊形式(对称和):
⑤ 含 \(i\) 的求和(导数法)
对 \((x+1)^n\) 两边求导后令 \(x=1\):
⑥ 含 \(i^2\) 的求和
再次求导或用恒等式推导:
5. 二项式反演
常用于「用至少 / 至多的计数求恰好的计数」,核心公式:
若
则:
6. 抽屉原理(鸽巢原理)
基本形式:\(n\) 个物品放入 \(k\) 个抽屉,至少有一个抽屉里有 \(\displaystyle\left\lceil \frac{n}{k} \right\rceil\) 个物品。
应用场景:证明存在性问题、求「最坏情况」下的最小数量。
7. 容斥原理
8. 斐波那契数列
通项公式(比内公式):
常用性质
递推关系:
组合数表示:
模周期性(皮萨诺周期):斐波那契数列模 \(m\) 会出现周期循环。
9.错排
问题:\(n\) 个元素的排列中,没有任何元素出现在其原来位置上的排列数。
递推公式:
通项公式:
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\) 。
加权拓展
那么矩阵树定理求的就是边权乘积之和,此时点的度数为连边权值和

浙公网安备 33010602011771号