排列组合的定义
排列
从 \(n\) 个不同元素中,任取 \(m\) 个不同的元素按照一定的顺序排成一列,所有可能的情况种数叫做排列数,记作 \(A_n^m\)。
组合
从 \(n\) 个不同元素中,任取 \(m\) 个元素并成一组,所有可能的情况种数叫做组合数,记作 \(C_n^m\),也记作 \(\binom{n}{m}\)
对于二者的区别最直观的理解就前者考虑顺序,而后者不考虑。
加法原理
做一件事,完成它可以有 \(n\) 类方法,在第一类方法中有 \(m_1\) 种不同方法,在第二类方法中有 \(m_2\) 种不同方法,……,在第 \(n\) 类方法中有 \(m_n\) 种不同方法,那么完成这件事共有 \(\sum_{i=1}^n m_i\) 种不同的方法。
乘法原理
做一件事,完成它需要分成 \(n\) 个步骤,做第一步有 \(m_1\) 种不同的方法,做第二步有 \(m_2\) 种不同的方法,……,做第 \(n\) 步有 \(m_n\) 种不同的方法。那么完成这件事共有 \(\prod_{i=1}^n m_i\) 种不同的方法。
二项式定理
变形:
性质:
- 杨辉三角与二项式系数有对应关系,所以根据杨辉三角的性质,我们可以得到递推关系:\(\binom{n}{k}=\binom{n-1}{k}+\binom{n-1}{k-1}\)。
- 在 \(n\) 个里面选 \(k\) 个,就相当于不选 \(n-k\) 个,这与选 \(n-k\) 个相等,\(\binom{n}{k}=\binom{n}{n-k}\)。
- 令 \(a=b=1\),\(2^n=\sum_{i=0}^n\binom{n}{i}\)。
- \(\sum_{i为奇数}\binom{n}{i}=\sum_{i为偶数}\binom{n}{i}=2^{n-1}\)
快速计算组合数的方法
- 预处理逆元,定义法计算
void init(){fact[0]=1;for(int i=1;i<=n;i++)fact[i]=fact[i-1]*i%mod;inv_fact[n]=qpow(fact[n],mod-2,mod);//费马小定理,当然也可以用其他方式for(int i=n-1;i>=0;i--)inv_fact[i]=inv_fact[i+1]*(i+1)%mod;return;
}
long long comb(int n,int k){return fact[n]*inv_fact[k]%mod*inv_fact[n-k]%mod;
}
- 将杨辉三角打表
- 模数较小的时候使用 Lucas 定理和 exLucas 定理
Lucas 定理 \(\binom{n}{k}=\binom{n\bmod p}{k\bmod p}\times \binom{\lfloor\frac{n}{p}\rfloor}{\lfloor\frac{k}{p}\rfloor}\),可以持续展开。注意,\(p\) 必须是质数。
int comb(int n,int k,int p){if(k>n) return 0;if(k==n||k==n) return 1;//C(n,0)=C(n,n)=1int res=1;for(int i=1;i<=k;i++)res=res*(n-k+i)/i;return res%p;
}
int lucas(int n,int m,int p){if(m==0) return 1;return lucas(n/p,m/p,p)*comb(n%p,m%p,p)%p;
}
范德蒙德卷积
组合意义:在一个大小为 \(n+m\) 的集合中取出 \(k\) 个数,可以等于把大小为 \(n+m\) 的集合拆成两个集合,大小分别为 \(n\) 与 \(m\),然后从 \(n\) 中取出 \(i\) 个数,从 \(m\) 中取出 \(k-i\) 个数的方案数。由于我们有了对于 \(i\) 的枚举,于是只需要考虑一种拆法,因为不同的拆法之间是等价的。
变式:
- \(\sum_{i=1}^n\binom{n}{i}\binom{n}{n-1}=\binom{2n}{n-1}\)
- \(\sum_{i=0}^n{\binom{n}{i}}^2=\binom{2n}{n}\)
- \(\sum_{i=0}^m\binom{n}{i}\binom{m}{i}=\binom{n+m}{m}\)
隔板法
模型一:将 \(n\) 个相同苹果放入 \(m\) 个不同的箱子里的方案数(可以限制是否为空)。
考虑箱子里至少放 \(1\) 个苹果的情况,将这 \(n\) 个苹果排成一列,形成 \(n-1\) 个空隙,在这 \(n-1\) 个空隙中插入 \(m-1\) 个板子,就形成了一种解。所以解为 \(\binom{n-1}{m-1}\)。
箱子可以为空时解为 \(\binom{n-1+m}{m-1}\),假设每个箱子里多出了一个虚拟苹果,我们就又回到了刚才的问题。
模型二:求方程 \(x_1+x_2+\cdots+x_m=n\) 的正整数解或自然数解的方案数。
变式:上式中 \(=\) 变为 \(\le\) 或 \(<\),我们可以虚拟一个 \(x_0\) 令其加上后面的 \(x\) 等于 \(n\)。