Skip to content

组合数

(nm)=(n1m)+(n1m1)(nm)=(nnm)i=0n(ni)=2ni=1ni(ni)=n2n1i=0k(n+ii)=(n+k+1k)(n+1k+1)=i=0n(ik)i=0k(ni)(mki)=(n+mk)

卡特兰数

Hn=(2nn)n+1Hn={i=1nHi1Hnin21n=0,1Hn=4n2n+1Hn1Hn=(2nn)(2nn1)

斯特林数

第一类斯特林数

存在 k 个置换环的大小为 n 的置换:[nk]

约定 [00]=1;当 n>0[n0]=0,当 k<0k>n 时取 0

递推公式

[nk]=[n1k1]+(n1)×[n1k]

性质式

n!=i=0n[ni]xn=i=0n[ni](1)nixi

第二类斯特林数

n 个有标号的球分配到 k 个无标号的盒子的方案数:{nk}

约定 {00}=1;当 n>0{n0}=0,当 k<0k>n 时取 0

递推公式

{nk}={n1k1}+k×{n1k}

性质式

xn=i=0n{ni}xi

特别地:

i=0nik=i=0k{ki}(n+1)i+1i+1

斐波那契数列

定义 fi={0i=01i=1fi1+fi2i2 的数列为斐波那契数列。

通项公式:

fn=(1+52)n(152)n5

5 在给定模数模意义下存在二次剩余,结合二次剩余和逆元可在 O(logn) 时间求解 fn

注:常见模数 109+7998244353,对 5 不存在二次剩余。109+95 存在二次剩余,解为:383008016,616991993

倍增:

f2k=fk(2fk+1fk),f2k+1=fk+12+fk2

根据奇偶性递推 fn 即可。

时间复杂度:O(logn),常数较小。

矩阵递推:

[fn1,fn]=[fn2,fn1]×[0111]

p=[0111][fn,fn+1]=[f0,f1]×pn

利用矩阵快速幂,可在 O(23×logn) 的时间计算 fn

预处理 2i 矩阵,可将询问转换成向量乘矩阵,矩乘满足结合律,时间复杂度:O(22×logn)

性质

  • fn1fn+1fn2=(1)n
  • fn+k=fkfn+1+fk1fn,特别地 f2n=fn(fn+1+fn1)
  • gcd(fa,fb)=fgcd(a,b),其中 a,b1
  • n1,k0fnfnk
  • 由 gcd 恒等式可得,当 a3,b1 时,fafbaba=1,2fa=1,会整除任意 fb,上述等价关系不再普遍成立

模意义下的周期性

记斐波那契数列模 m 的最小正周期为 π(m)。正整数 T 是它的一个周期,当且仅当 (fT,fT+1)(0,1)(modm)

令模数为 m,斐波那契数列的最小正周期不超过 6m

模数较小时暴力枚举求周期即可。

斐波那契数列模 2 的最小正周期是 3,模 5 的最小正周期是 20

对于奇素数 p1,4(mod5)p1 是斐波那契数列模 p 的周期。

对于奇素数 p2,3(mod5)2p+2 是斐波那契数列模 p 的周期。

上面给出的是候选周期,不一定是最小周期。可以分解候选周期,并依次尝试约去质因子;使用 (fT,fT+1)(0,1)(modp) 检验,得到 π(p)

对于素数幂,若 k2M=π(pk1),则 pM 是模 pk 的一个候选周期,且

Mπ(pk)pM.

因此 π(pk) 只能是 MpM。需要先检验 M 在模 pk 下是否仍为周期,不能无条件认为最小周期每层都恰好乘 p

m=piai,逐层求出每个最小周期 π(piai) 后,根据中国剩余定理有

π(m)=lcmiπ(piai).

错位排列

定义 Dn 表示满足 piin 元排列数量,并约定 D0=1

Dn=n!i=0n(1)ii!Dn=nDn1+(1)n(n1)

指数生成函数

D(x)=n0Dnxnn!=exp(ln(1x)x)

贝尔数

定义 Bn 表示把大小为 n 的集合划分成若干非空子集的方案数,并约定空集只有一种划分,即 B0=1

Bn+1=i=0n(ni)Bi(n0)Bn=i=0n{ni}(n0)

贝尔三角形

定义 a0,0=1。对于 n1,先令 an,0=an1,n1,再令

an,m=an,m1+an1,m1(1mn),

Bn=an,0

指数生成函数

B(x)=n0Bnxnn!=exp(ex1)

欧拉数

定义 E(n,m) 表示 n 元排列中恰好有 m 个上升位置的排列数量,即恰好有 mi[1,n1] 满足 pi<pi+1

递推式:

E(n,m)={1n=0m=00m<0(n=0m0)(n1mn)(nm)E(n1,m1)+(m+1)E(n1,m)n1,0m<n

分拆数

定义 p(n,k) 表示 n=i=1krir1r2rk1 的方案数。约定 p(0,0)=1,下标越界时取 0,则 pn=k=0np(n,k),特别地 p0=1

分拆数增长率相对不大:

  • pn2×105,n50
  • pn106,n60
  • pn5×106,n70

普通生成函数:

P(x)=n=0pnxn=i=1(1xi)1=exp(i=1ln(1xi))=exp(i=1j=1xijj)=exp(n=1σ1(n)nxn).

其中 σ1(n)=dnd 表示 n 的正因数之和。

性质:

pn(k) 是最大部分为 kn 的分拆数量,qn(k) 是恰好 k 个部分的分拆数量。

pn(k)=qn(k)

根据此性质,求 p(n) 时可以根据拆分出 ri 的大小根号分治,时间复杂度:O(nn)

pno 是把 n 分拆成若干奇数部分的方案数,pnd 是把 n 分拆成若干互不相同部分的方案数。

pno=pnd

五边形数定理:

Euler 五边形数定理给出

Φ(x)=i=1(1xi)=1+k=1(1)k(xk(3k1)/2+xk(3k+1)/2).

gk=k(3k1)2,gk+=k(3k+1)2(k1),

二者称为广义五边形数。其指数依次为 1,2,5,7,12,15,,在 Φ(x) 中的符号按 ,,+,+, 成对出现。

由于 P(x)=Φ(x)1,比较 P(x)Φ(x)=1xn 系数,并约定 p0=1pn=0 (n<0),可得

pn=k=1(1)k1(pngk+pngk+).

递推中的符号按 +,+,,, 成对出现。因为 gk±=Θ(k2),对每个 n 只有 O(n) 个有效项,计算 p0,,pn 的时间复杂度为 O(nn)