随笔 - 164  文章 - 0  评论 - 4  阅读 - 9878

组合数与二项式定理

鸽巢原理

n+1 只鸽子飞进 n 个笼子,必定有一个笼子出现 2 只鸽子
将 n 个物体,划分为 k 组,那么至少存在一个分组,含有大于或等于 nk 个物品


组合数

组合数表示:(nk)=Cnk
组合数基本公式: Cnm=n!m!(nm)!=n(n1)···(nm+1)m!
组合数递推公式: Cnm=Cn1m1+Cn1m

求解组合数

  • 线性求组合数
    范围 a[1,N1],0ba
    记得主函数里调用 pre 函数,记得修改 N 和 mod 的值!
const int N = 1e6 + 10, mod = 998244353;
ll fact[N + 1], finv[N + 1];
ll qpow(ll a, ll x){//带模快速幂
a %= mod;
ll res = 1;
while(x){
if(x & 1) res = res * a % mod;
x >>= 1;
a = a * a % mod;
}
return res;
}
void pre(){//线性预处理
fact[0] = 1;
for(int i = 1; i <= N; ++ i){
fact[i] = fact[i - 1] * i % mod;
}
finv[0] = 1;
finv[N] = qpow(fact[N], mod - 2);
for(int i = N - 1; i > 0; -- i)
finv[i] = finv[i + 1] * (i + 1) % mod;
return ;
}
ll C(int a, int b){//求取组合数
if(a < 0 || b < 0) return 1;
return fact[a] * finv[b] % mod * finv[a - b] % mod;
}

//来自焦佬 暂不建议,因为没有整理过

注意maxm的范围为C(n,m)中,n+m的最大取值。。。

int facinv[maxm + 10], fac[maxm + 10];
ll qpow(int b, int p, int k) {
ll ans = 1, base = b;
while(p) {
if(p & 1) ans = ans * base % k;
p >>= 1;
base = base * base % k;
}
return ans % k;
}
ll C(ll n, ll m) {
if(n < m) return 1;
if(m*2>=n) m=n-m;
return (ll)fac[n] * facinv[m] % mod * facinv[n - m] % mod;
}
facinv[0] = fac[0] = 1;
for(int i = 1; i <= maxm; i++)
fac[i] = (ll)fac[i - 1] * i % mod;
for(int i = 1; i <= maxm; i++){
facinv[i] = facinv[i - 1] * qpow(i, mod - 2, mod)%mod;
}

组合数递推公式 Cnm=Cn1m1+Cn1m

递推预处理组合数

void pre(){
for(int i=1;i<=1000;++i){
c[i][i]=c[i][0]=1;
for(int j=1;j<i;++j){
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
}
return ;
}

相关资料

例题


范德蒙德卷积 - 组合数公式的推导

范德蒙德卷积是一种合并组合数的式子,主要应用于组合数学的公式推导。
范德蒙德卷积公式i=0k(ni)(mki)=(n+mk)

oi wiki :在一个大小为 n+m 的集合中取出 k 个数,可以等于把大小为 n+m 的集合拆成两个集合,大小分别为 n 与 m,然后从 n 中取出 i 个数,从 m 中取出 k-i 个数的方案数。由于我们有了对于 i 的枚举,于是只需要考虑一种拆法,因为不同的拆法之间是等价的。

推论

  • 推论 1 :i=rs(nr+i)(msi)=(n+mr+s)
  • 推论 2 :i=1n(ni)(ni1)=(2nn1)
  • 推论 3 :i=0n(ni)2=i=0n(ni)(nni)=(2nn)
  • 推论 4 :i=0m(ni)(mi)=(n+mm)

相关资料

oi wiki - 范德蒙德卷积


二项式定理

二项式定理:(a+b)n=r=0nCnrarbnr
二项式系数:Cnr=n!r!(nr)!

例题

posted on   Qiansui  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2022-07-11 C++运算符优先级
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示