组合数学

组合数学

组合数定义式

(nm)=n!m!(nm)!,表示 n 个数中选 m 个。

下降幂

nm=n(n1)(n2)(nm+1)

上升幂

nm=n(n+1)(n+2)(n+m1)

相关结论

  1. nm=(n+m1)m,用于处理上升幂
  2. nm=(1)m(mn1)m,用于处理 n<0 情况
  3. xn=(1)n(x)n,用于上升下降幂的转换
  4. (nm)=nmm!

特殊情况

  • 00=0!=x0=1
  • m>nm<0 时,(nm)=0
  • m=0m=n 时,(n0)=(nn)=1

各种定理

1. 递推式(春游)

(nk)=(n1k)+(n1k1)

初值:(i0)=1,n0i

2. 翻转

(nk)=(nnk),条件:n>0

3. 吸收公式(用于处理常数或参数)

  • k(nk)=n(n1k1),用组合数定义展开证明
  • 1k(nk)=1n(n1k1)
  • (nk)(nk)=n(n1k),用“春游”证明.
  • i=0nim(ni)=i=0nnm(nmim)=nm2nm,用很多次吸收公式的推论。

4. 上指标反转

(nk)=(1)k(kn1k),用下降幂性质证

5. 二项式定理

  • (x+y)n=k=0n(nk)xkynk
  • nR|x|<|y| 时,(x+y)n=k=0+(nk)xkynk(泰勒展开可证明)
  • 常用:
    • (x+1)n=k=0n(nk)xk
    • (x1)n=k=0n(1)nk(nk)xk
    • (nk)(x+1)nxk项系数。这可以用来证明其他定理。(如lucas)

6. 一行之和定理

  • k=0n(nk)=2n,是二项式定理中 x=y=1 的情况
  • 可用于有类似下指标求和的式子:k=mn(nk)=k=0n(nk)k=0m1(nk)=2n2m

7. 平行求和

k=0m(n+kk)=(n+m+1m),右边用“春游”展开可证

8. 上指标求和

k=0n(km)=(n+1m+1),用“春游”展开

9.

k=0m(1)k(nk)=(1)m(n1m)

10. 卷积

  • k(rk)(snk)=(r+sn),从 r+s 个元素中选 n 个,等于从 r 中选 k 个,从 s 中选 nk 个,k(0,n)
  • 该式用于处理大部分的
  • 变型:k(rm+k)(snk)(1)k=(1)m+n(rsm+n)

11.

(rm)(mk)=(rk)(rkmk)

  • 用定义展开证明
  • 组合意义:从 r 中选 m 个,再从这 m 个中选 k 个,等价于先选 k 个要用的,再从 rk 个中选 mk 个陪衬的。

多项式系数

  • n 个不同的物品分成 m 组,第 i 组有 ai 个,总方案数:n!i=1mai!i=1mai=n),可写作:(na1,a2,,am)
  • (na1,a2,,am)=k=1m1(i=kkaii=k+1ai)

[注:上文是用AI把笔记的照片转文字的来的,可能会有错]

取模意义下的组合数

一些引理

  1. (pn)modp=[n=0n=p]

    证明:(pn)=p!n!(pn)!,因为分子只有一个p,分母只有在n=p或n=0时有p。

  2. (1)(a+b)pap+bp(modp)(2)(a+b)pn=0p(pn)anbpn(modp)(3)ap+bp(modp)

Lucas定理

一般来说,我们预处理阶乘,然后用定义式来计算组合数,但是当遇到n和m很大的时候,不支持O(n)的复杂度时,就要用到Lucas定理。

对于质数 p,

(nm)modp=(n/pm/p)(nmodpmmodp)modp

证明:
(nm)(x+1)nxm 项系数。

(x+1)nmod p=(x+1)pn/p(x+1)n mod pmod p =(xp+1)n/p(x+1)n mod pmod p xmm=m/pp+m%p(nm)=(n/pm/p)(nmodpmmodp)mod p

拓展Lucas

用于处理模数M不是质数的情况。

M=p1α1pmαm

我们可以求出每一个 (nm)modpαi,然后CRT合并就行

我们吧n!,m!和nm!中,所有p的因子提出来,

会有形如 n!pxm!py(nm)!pzpxyzmodpα的式子。

现在分母可以exgcd求逆了,我们只需要求形如下面这样的式子:

n!pxmodpα

n!=pnp(np)!(i,gcd(i,p)=1pαi)npα(i,gcd(i,p)=1nmodpαi)

前面两个是n中p的倍数,第三个是n对p的循环节,最后一个是n对p的余数。

因为要求的是n!扣掉p的因子对pα取模,所以把pnp直接扔掉,然后继续递归求解(np)!

感觉这玩意非常难写,而且好像用处不大。

经典题型

一,插板法:

type1: 有n个元素,m个板子。现在要求每两个板子之间至少有一个球,求方案数。

n个球有n-1个空位(认为头尾不放板)。于是答案是(n1m)

type2:板之间可以不放球。

对于每一种方案,在相邻两个板之间再放一个球。这个与n+m个球的type1等价。

所以答案是 (n+m1m)

练习题:从 1, 2, · · · , n 中选出 k 个数,要求任何两个数都不相邻,一共有多少种选法?

分成k+1段,设每一段长度为ai,将a1an的长度加1。

ai=nk+2ai>0

所以相当于在n-k+2个数插k个板

所以答案是 (nk+1k)

二,把组合数用二项式的 xn 项系数理解

例题链接 解法 循环卷积

给定 n,p,r,k (1n109,0r<k50,2p2301),求

imodk=r(nki)modp

imodk=r(nki)=imodk=r[xi](1+x)nk=[xr]((1+x)nkmod(xk1))

直接循环卷积快速幂,时间复杂度 O(k2(logn+logk))

三,下指标求和的处理方法

我们发现下指标求和没有公式,所以我们要想办法转换下指标求和。

来看一个例题

题面

给定 n,m,一共 T 组询问,求 k=0m(nk)mod2333

n,m109 级别,T在 105 级别。

解法:

先把 k 按照 kp 分类

k=0m(nk)=i=0m/p1j=0p1(nip+j)+k=pm/pm(nk)

再用 lucas 定理展开:

=i=0m/p1(n/pi)j=0p1(nmodpj)+k=pm/pm(n/pk/p)(n%pk%p)

注意到 j=0p1(nmodpj) 用一行之和定理表示为 2n%p(n/pk/p) 始终为定值,而且可以用普通的 Lucas 来求,于是上式可改写为:

=2nmodpi=0m/p1(n/pi)+(n/pk/p)k=0m%p(n%pk)

然后发现左右两边都可以递归求解。于是做完了。复杂度为 O(Tlogpn)

四,用组合意义

例题(某联考题):

i=0nim(ni)mod p

n 是1e9, m 是1e6,p是1e9+7

有一种用斯特林数把上升幂转普通幂转下降幂,然后用斯特林数奇妙公式乱搞的做法,但是用组合意义做会有奇效。

简单转换一下式子:(把上升幂转组合数形式)

m!i=0n(i+m1m)(ni)

先不看 m! , 我们可以认为是 :从 n 个球中选 i 个球,再往 i 个球中加 m - 1 个球,最后从i - 1 + m 个球选m个球。因为我们 的枚举范围只能是 O(m) 的,所以考虑转换组合意义。这相当于从新加的 m - 1 个球中选 j 个球,然后从原先钦定的 i 个球中钦定 j + 1 个球不选,剩下 n - i - 1个球的排列方式排列方式任意。

所以答案是:

m!i=0m1(m1i)(ij+1)2ni1

总结一下

p 很小的时候,下指标求和可以用 Lucas 定理递归求解。

nm 的时候,可以用一行之和来求。

拓展

  1. 错排
  2. 卡特兰数
  3. 斯特林数
  4. 二项式/容斥
  5. 牛顿级数
posted @   花子の水晶植轮daisuki  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
https://blog-static.cnblogs.com/files/zouwangblog/mouse-click.js
点击右上角即可分享
微信分享提示