组合数
组合数
定义
- 从 \(n\) 个物品中选 \(m\) 个物品的方案数。
- 记作 \(C^m_n\) 或 \(C(n,m)\) 或 \(\binom{n}{m}\)。
- \(C_n^m=\dfrac{n!}{m!(n-m)!}\)
- \(C_n^m=C_{n-1}{m-1}+C_{n-1}^{m}\)
性质
- \(C^m_n=C^{n-m}_n\)
- \(C_n^m=\textstyle\sum^{n-1}_{i=0}C^{m-1}_i\)
- \(m\times C_n^m=n\times C^{m-1}_{n-1}\)
- \(\textstyle\sum_{i=0}^nC_n^i=2^n\)
代码
莫名其妙拿了个次优解(?
利用乘法逆元快速求解 查询复杂度 \(O(\log M)\) ,\(M\) 为模数。
仅适用于模数为质数的情况。
ll QuickPow(ll a,ll b){
ll res = 1;
while(b){
if(b&1) res = res * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return res % MOD;
}
ll fro[maxN];
inline void pre(ll n){
fro[0] = 1;
for(ll i = 1;i<=n;i++) fro[i] = fro[i-1] * i % MOD;
}
inline ll inv(ll n){
return QuickPow(n,MOD-2) % MOD;
}
inline ll C(ll n,ll m){
if(n < m) return 0;
return fro[n] * inv(fro[m])% MOD * inv(fro[n-m]) % MOD;
}
卡特兰数
-
简单来说,卡特兰数就是一个有规律的数列,在坐标图中可以表示为:从原点 \((0,0)\) 出发,每次向 \(x\) 轴或者 \(y\) 轴正方向移动 \(1\) 个单位,直到到达\((n,n)\)点,且在移动过程中不越过第一象限平分线的移动方案总数。
-
\(Catalan_n=\dfrac{1}{n+1}C^n_{2n}\)