主要还是组合数学之类的,数论考的比较少写的也比较少。
0. 排列组合
定义 Amn 表示从 m 个物品中有序地取 n 个,发现第 i 次有 m−i+1 种选择,则 Amn=i=1∏n(m−i+1)=(m−n)!m!;定义 Cmn 表示从 m 个物品中无序地取 n 个,与上面的区别是每个互不区分,所以有 Cmn=n!Amn=n!(m−n)!m!。
还有就是两个原理,一个问题可以被分成几个互相独立的子问题,则问题的答案是所有子问题的答案之和,称为加法原理;如果这几个子问题不独立,则答案为几个子问题的答案之积,称为乘法原理。
卡特兰数
问就是考到了不会。
定义式是这样的: Cn=⎩⎨⎧1,n=0i=0∑n−1CiCn−i−1,n>0。因此,卡特兰数和规模为 n 的可以通过枚举分界点而分成 i 与 n−1−i 的子问题的问题关系密切。
一个经典的例子是对于一个 n×n 的网格图,左下角为 (0,0),右上角为 (n,n) 从左下角开始每次只能向右或向上走一格,不能越过直线 y=x 的方案数为 Cn。
证明一下,设 Fk 表示从 (0,0) 到 (k,k) 的合法路径数,则第一步一定向右走到 (1,0),最后一步一定是从 (k,k−1) 走到 (k,k),上述方案数为 Fk−1。而从 (k,k) 走到 (n,n) 的方案数为 Fn−k,这个 k 的贡献就是 Fk−1Fn−k。所以,Fn=k=1∑nFk−1Fn−k,令 i=k+1 则有 Fn=i=0∑n−1FiFn−1−i,恰好是卡特兰数的递推式。
更一般的,我们可以抽象上面的模型成:有两种操作,在任何时候第二种操作的次数不得少于第一种操作的次数,求长度为 n 的合法操作序列方案数。
符合上面模型的就有很多了,比如括号序列计数与出栈序列计数等。
但是,类卷积式还是算的太慢了,以下是几个可以 O(n) 计算的式子:
Cn=n+11C2nn=n!(n+1)!(2n)!Cn=C2nn−C2nn+1Cn=n+14n−2Cn−11. 欧拉函数
定义为 φ(x)=i=1∑x[gcd(i,x)=1]。是个积性函数。
对于单个函数的计算可以用 φ(n)=ni=1∏kpipi−1 来算,其中 n=i=1∏kpiai。多个的计算可以直接线性筛,显然有 φ(p)=p−1,p∈Primes,整除那里的特判是 φ(i×p)=φ(i)×p,感性理解一下就是因为乘的是个质数所以 φ(i) 的每一种互质情况都可以在 φ(i×p) 中体现,而 [1,p−1] 中每一个数都与 p 互质,所以 (i(j−1),ij] 中的每个原本互质的数仍然互质,所以是 φ(i×p)=φ(i)×p。
有个结论是 n=d∣n∑φ(d),可以拿来化简式子,狄利克雷卷积的形式是 Id=φ∗1,在杜教筛里面有用。
欧拉定理
若有 gcd(a,p)=1,则有 aφ(p)≡1(modp)。
这个的应用范围还是有点太小了,所以有扩展欧拉定理:apmodm=⎩⎨⎧apmodφ(m)apapmodφ(m)+φ(m)gcd(a,m)=1gcd(a,m)=1∧p<φ(m)gcd(a,m)=1∧p≥φ(m)modm。
欧拉函数有个性质,φ(φ(n))≤2n,因为对于一个奇数,一定有 φ(n)=n∏2l+12k,所以一定会变成偶数,而对于一个偶数,小于它的偶数一定不与它互质,这一部分有 2n 个,所以 φ(φ(n)) 一定小于等于 2n。
依据这个,我们可以解决一类模意义下的幂塔求值问题。因为模数会在 O(logn) 次操作后变为 1。
模板可以看看 Codeforces 906D↗。
2. 容斥
一句话就是 ∣S1∪S2∪…∪Sn∣=k∑(−1)k−1∣1≤p1<p2<…<pk≤n⋂Spi∣。
在数数题里面拿来去重。
二项式反演
二项式定理众所周知了提一嘴就行: (x+y)n=i=0∑nCnixiyn−i
由于这是总结所以我懒得写证明了,设 f(x) 为至少 / 至多 x 的方案数,g(x) 为恰好 x 的方案数:
则有:
至少的情况: f(n)=i=n∑mCmng(i)⇔g(n)=i=n∑m(−1)i−kCmnf(i)
至多的情况: f(n)=i=0∑nCnig(i)⇔g(n)=i=0∑n(−1)n−iCnif(i)
3. 大大小小的数论定理
Bezout 定理
设 a,b 为不全为 0 的整数,则 ∀x,y∈Z,gcd(a,b)∣ax+by,并且 ∃x,y∈Z,ax+by=gcd(a,b)。
下面几个都有普通和 ex 版本。
辗转相除法
gcd(x,y)=gcd(y,xmody),当 y=0 时为 x。
exGCD
用来解 ax+by=gcd(a,b) 的一组特殊解。
这个可以顺手求 gcd(a,b),到最底层 xn=1,yn=0,之后每一层有 xn=yn+1,yn=xn+1−⌊ba⌋yn+1。
CRT
哎我感觉不如下面的 exCRT 好用。
求解的是如下一元线性同余方程组:⎩⎨⎧x≡a1(modn1)x≡a2(modn2)⋮x≡ak(modnk),条件是所有 ni 两两互质。
做法如下:
- 求出 N=∏ni
- 对于第 i 个方程,求出 mi=niN 与 mi 在模 ni 意义下的逆元 mi−1,最后答案为 ∑aimimi−1(modN)。
exCRT
轮椅。
条件是删去 CRT 的条件,在某些题里面可以用来合并答案。
设有两个方程 x≡a1(modn1),x≡a2(modn2)。
则可以转化为不定方程 x=k1n1+a1,x=k2n2+a2,则有 k1n1−k2n2=a2−a1。
由 Bezout 定理,当 gcd(n1,n2)∤a2−a1 时无解。
否则可以用 exGCD 求出来一组可行的 k1,k2,两原方程可以合并为 x≡k1n1+a1(modlcm(n1,n2))。
合并成只剩一个后 exGCD 求值即可。
Lucas 定理
适用于模数 P 为质数的情况,CmnmodP=CmmodPnmodP×C⌊Pm⌋⌊Pn⌋。
exLucas 定理
适用于模数不是质数的情况,设 P=∏pici,我们可以求出 Cmn 对 pici 取模的值,然后用 CRT 合并。这个直接用阶乘定义算,可能阶乘与 pc 不互质,推一下式子变成 pyn!×pz(m−n)!pxm!×px−y−z。
然后考虑怎么算上面那几个,我们设 fp(i) 为 i! 中的 p 的因数个数,有 fp(i)=⌊pi⌋+fp(⌊pi⌋)。设 faci=pfp(i)i!,这个就等价于上面推的那个,然后除完之后 i!=1×2×…×(p−1)×(p+1)×…×(2p−1)×(2p+1)×…。
所以,有 faci=wi×fac⌊pi⌋,其中 wn=∏i=1ni[p∤i]。这个可以用 wi=(wpc−1⌊pci⌋)×wnmodpc 预处理。
所以最后 Cmnmodpc=pfp(m)−fp(n)−fp(m−n)×facm×facn−1×facm−n−1,求出每一个之后用 CRT 合并即可。
Wilson 定理
省流:对于质数 P 有 (P−1)!≡−1(modP)。
exWilson
TBU
数学一家子
2025 10月 28 周二 2292 字 · 10 分钟