数学
内容太多,估计得分成很多个 blog 写了。这是算法竞赛中的数学,和高中/大学数学无关。
目前希望是包含这几个模块
- 数论
- 多项式(用于算法竞赛的基础工具)
- 组合计数
- 线性代数
- 群论
- 博弈论
- 概率期望
- 计算几何
- 杂项
数论
经典组合计数
排列组合
容斥原理
- 二项式反演
[HAOI2018] 染色
想要求出出现次数恰好为 \(S\) 的颜色数恰好为 \(k\) 的方案数,记作 \(f(k)\)。钦定 \(k\) 种颜色,恰好为 \(S\),这样的方案数记作 \(g(k)\)。那么有 \(g(k)=\sum_{i=k}^{m}\binom{i}{k}f(i)\)。于是有 \(f(k)=\sum_{i=k}^{m}(-1)^{i-k}\binom{i}{k}g_i\)。而 \(g\) 是好算的 \(\binom{m}{k}\frac{(n)!}{(s!)^k(n-ks)!}(m-k)^{n-ks}\)。
剩下的部分反演一下就好了。
多项式生成函数
拉格朗日插值
已知曲线上 \(n+1\) 个点值 \((x_0,y_0),\dots (x_n,y_n)\)。可以唯一还原出一个多项式。
当点值的横坐标取到 \(0\sim n\) 时,可以 \(O(n)\) 计算。一般的还原多项式均要 \(O(n^2)\) 的时间。
一个很经典的应用是自然数幂和,可以看下一章。
而拉插一般的应用都是在优化卷积。注意到多项式乘法是 \(O(n^2)\) 的,而点值的乘法是 \(O(n)\) 的,在次数固定的情况下,我们就很可以直接在点值下搞事情,最后再插值回来。
直接带入
观察一些特殊值,发现:
观察拉格朗日插值的式子,发现
这题横坐标是 \(0\sim d\) 所以可以直接 \(O(d)\) 预处理阶乘和阶乘逆元。
自然数幂和
斯特林数求法
然后我们发现只需要求第二类斯特林数行。
预处理复杂度 \(O(k\log{k})\)。查询复杂度 \(O(k)\)。和拉格朗日插值一样。
可以从中看出这是一个 \(k+1\) 次多项式。
- 关于如何求 \({k\brace i}\)
设 \(G(i)=i^n,G_i=\sum_{j=0}^{i}{i\choose j}F_j,F_i={n\brace i}i!\)
然后二项式反演,得到 \({n\brace i}=\sum_{j=0}^{i}\frac{(-1)^{i-j}j^n}{(i-j)!j!}\)。直接卷积即可。
伯努利数求法
伯努利数的定义
然后自然能推出递推式:
然后又一个定理
然后我们发现这很不好用,因为我们一般都是要求 \(\sum\limits_{i=1}^{n}i^k\),所以我们把 \(n+1\) 带进去,发现新的系数就是在算 \(B_i\) 时把 \(B_i++\) 所得的系数。
拉格朗日插值求法
如果我们只需要求 \(f(n)\),那么我们可以在 \(O(n)\) 的时间内利用拉格朗日插值求。
但是如果我们要插出多项式,那就只能多项式快速插值了(而且还是大常数 \(O(nlog^2n)\))。所以不推荐用这个方法。
从生成函数角度推导
从新定义自然数幂和 \(S_k(n)=\sum\limits_{i=1}^{n}i^k\)。
我们设 \(\hat{G}(n,z)\) 为序列 \(S_0(n),S_1(n),\dots\) 的 EGF,即 \(\hat{G}(n,z)=\sum\limits_{i\ge 0}\frac{S_i(n)}{i!}z^i=\sum\limits_{i\ge 0}\frac{\sum\limits_{j=1}^{n}j^i}{i!}z^i=\sum\limits_{i=1}^{n}\sum\limits_{j\ge 0}\frac{i^j}{j!}z^i=\sum\limits_{i=1}^{n}\exp(iz)\)。
然后我们可以进行如下化简:
然后我们可以继续推导,分离常数。
设前者为 \(\hat{B}(z)\),后者显然为 \([n,n^2/2,n^3/3,...]\) 的 EGF,所以可以得到
然后发现是个卷积,于是就可以对所有 \(k\) 在 \(O(n\log n)\) 的时间求 \(S_k(n)\) 了。
也就是说我们构造了一个数列 \(B\),其 EGF 为 \(\frac{xe^x}{e^x-1}\)。我们把这种数称作“伯努利数”。
我们可以直接用多项式求逆求出伯努利数。注意无法直接求逆,因为 \(0\) 次项系数是 \(0\),所以要稍加变形,可得 \(\hat{B}(z)=\frac{\sum\limits_{n\ge 0}\frac{1}{n!}z^n}{\sum\limits_{n\ge 0}\frac{1}{(n+1)!}z^n}\),然后再求逆即可。
例
给定 \(n=\prod p_i^{c_i}\) 和 \(K\),求 \(\sum\limits_{i=1}^{n}[\gcd(n,i)=1]\sum_{j=1}^{n}j^K\)。\(1\le K\le 10^6\)。
对式子稍加变形
然后套到原式中有
差分和前缀和
差分相当于卷上了一个 \((1-x)\),而前缀和相当于卷上一个 \(\sum_{i\ge 0}x^i=\frac{1}{1-x}\)。而多项式的乘法又可以等价于点值的乘法,所以差分等价于 \((0,1),(1,0),(2,-1),\dots (d,1-d)\)。\(k\) 阶差分等价于卷上 \((1-x)^k=\sum_{i=0}^{k}(-1)^{i}\binom{k}{i}x^i\)
线性递推
生成函数
大概率不考,记几个比较基本的。
\(\exp(F(x))\) 是连通变不连通,那么不连通 \(\ln\) 一下就是连通的。
五边形数定理
广义的五边形数:\(p(n)=\frac{3n^2-n}{2},n\in \mathbb Z\)。
分拆数:\(P(x)=\prod_{i\ge 1}\frac{1}{1-x^i}\),即为把 \(n\) 拆成若干无序数的和的方案数。
定理:\(\frac{1}{P(x)}=\sum_{k=-\infty}^{\infty}(-1)^{k}x^{\frac{3k(k-1)}{2}}\)。
这个定理比较怪,其实只用记一个东西 \(Q(x)=\sum_{k=-\infty}^{\infty}(-1)^{k}x^{\frac{3k(k-1)}{2}}\) 它和 \(P(x)\) 互为倒数。
线性代数
见 线性代数基础。
概率期望
基础概念
样本点 一个事件中不能再细分的结果被称为样本点。
样本空间 所有样本点的集合称作样本空间 \(\Omega\)。
随机事件 一个随机事件是样本空间的一个子集。
事件的运算 两个事件的并称作事件和(\(A+B\)),两个事件的交称为事件积(\(AB\))。
古典概型
如果一个随机现象满足:
- 只有有限个基本结果。
- 每个基本结果出现的可能性是一样的。
把这种概率称作古典概率。可以这么定义 \(N_A\) 代表 \(n\) 次实验后 \(A\) 事件发生的次数,\(P(A)\) 代表 \(A\) 事件的概率即为 \(\lim_{n\to \infty}\frac{N_A}{n}\)。
更漂亮的定义
\(P(A)\) 是一个集合从实数的映射,满足下述公理:
- 非负性 对于事件 \(A\),有概率 \(P(A)\in [0,1]\)。
- 规范性:\(P(\Omega)=1\)
- 可加性:若 \(A\cap B=\emptyset\), 则 \(P(A\cup B)=P(A)+P(B)\)。
条件概率
\(P(B\mid A)\) 代表 \(A\) 发生的前提下 \(B\) 发生的概率。有 \(P(B\mid A)=\frac{P(AB)}{P(A)}\)。
那么显然就有 \(P(AB)=P(A)\cdot P(B\mid A)=P(B)\cdot P(A\mid B)\)。
全概率公式 对于随机事件 \(A_1,A_2,\cdots A_n\),\(A_i\cap A_j=\emptyset\) 且 \(\sum P(A_i)=1\)。则有 \(P(B)=\sum P(A_i)P(B\mid A_i)\)。
贝叶斯公式 \(P(B_i\mid A)=\frac{P(B_i)P(A\mid B_i)}{\sum P(B_j)P(A\mid B_j)}\)。
证明:根据乘法公式和全概率公式可得。
假概率题
实则是计数题。
例
等价于计算不同构的二叉树叶节点个数的和。设 \(n\) 个点的二叉树个数是 \(f_n\),那么 \(n\) 个点的二叉树叶节点和就是 \(nf_{n-1}\)。
证明:设 \(g_n\) 代表 \(n\) 个点的二叉树叶节点个数。那么显然有 \(g_n=\sum_{i+j=n-1}g_if_j+g_jf_i=2\sum_{i=0}^{n-1}f_ig_{n-1-i}\),即 \(G(z)=2zF(z)G(z)+z\)。
比对系数 \(g_{n+1}=(n+1)f_n\),得证。
于是最后的答案即为 \(\frac{nf_{n-1}}{f_n}=\frac{n(n+1)}{4n-2}\),本题没有用到一点概率期望的解题方法,是一道纯计数题。
随机变量
对于离散的随机变量,可以抽象成几个事件 \(x_1,x_2,\cdot x_n\),用 \(P(X=x_i)=p_i\) 来描述。
差分:\(P(X=K)=X(X\le K)-P(X\le K-1)\)。
数学期望 记 \(EX=\sum x_ip_i\) 是 \(X\) 的期望。
线性性 \(E(aX+b)=aE(X)+b,E(X+Y)=E(X)+E(Y)\)。
证明:
\(X,Y\) 是随机变量 \(P(X=x_i)=a_i,P(Y=y_i)=b_i\),那么 \(E(X)=\sum x_ia_i,E(Y)=\sum y_ib_i\),\(E(X+Y)=\sum\sum x_iy_i(a_i+b_i)=E(X)+E(Y)\)。
方差 \(DX=E(X-EX)^2\)
性质:\(D(aX+b)=a^2\cdot DX,DX=E(X^2)-(EX)^2\)。
例
概率为 \(p\) 的事件的发生的期望。
\(E(X)=\sum P(X=i)i=\sum (P(\ge i)-P(X\ge i+1))i=\sum ((1-p)^{i-1}-(1-p)^i)i=\sum (1-p)^{i}=\frac{1}{1-(1-p)}=\frac{1}{p}\)。
例
丢硬币连续 \(n\) 次正面的期望。
利用动态规划,\(E[n]\) 代表答案,\(E[n]=0.5(E[n-1]+E[n])+1=2^{n+1}-2\)。
另解:连续丢 \(i\) 个正面的概率是 \(\frac{1}{2^i}\),那么连续丢 \(i\) 个正面的期望就是 \(2^i\),假设已经有 \(j\) 个正面了,那期望就是 \(2^{n-j}\)。所以 \(EX=\sum_{j=0}^{n-1}2^{n-j}=\sum_{i=1}^{n}2^i=2^{n+1}-2\)。
例
随机长度为 \(n\) 的连续串,每个位置为 \(1\) 的概率是 \(p_i\),每个长度为 \(x\) 连续的 \(1\) 的贡献是 \(x^3\),求期望得分。\(1\le n\le 10^5.\)
直接动态规划不好扩展,尝试二项式定理展开,记录 \(x,x^2,x^3\) 的期望,根据期望线性性,可以直接组合在一起。
例
给定一棵有根树,结点编号从 \(1\) 到 \(n\)。根结点为 \(1\) 号结点。对于每一次操作,等概率的选择一个尚未被删去的结点并将它及其子树全部删去。当所有结点被删除之后,游戏结束;也就是说,删除 11 号结点后游戏即结束。要求求出删除所有结点的期望操作次数。
\(1\le n\le 10^5.\)
考虑每个点被删掉的概率,也就是他是他到根这条链上第一个被删的概率。显然是 \(\frac{1}{dep_i}\)。根据期望的线性性,总的期望操作次数等于每个点的期望操作次数的和,也就是 \(\sum \frac{1}{dep_i}\)。
例
现给定一个 DFS 序和 BFS 序,我们想要知道,符合条件的有根树中,树的高度的期望。\(2\le n\le 2\times 10^5\).
显然树高就是给 BFS 序分段,不妨设 BFS 是 \(1,2,3,\dots,n\),考虑什么位置可以分段。
- 如果 \(dfn_x>dfn_{x+1}\) 那么 \(x\) 应该在 \(x+1\) 的上一层,必须分。
- 否则我们不能确定
对于 DFS 相邻的两点 \(dfn_x+1=dfn_y\),如果 \(x<y-1\),那么一定这一段的节点深度差不超过 \(1\)。而且这个贡献在之前已经被算过了,所以这一段都不能再贡献了。这样就得到了一个充要条件。
Min-Max 容斥
记 \(\min(S)=\min_{a_i\in S}a_i\),同理有 \(\max(S)=\max_{a_i\in S}a_i\)。
可以只用 \(\max\) 和 \(\min\) 表示出对方
设 \(\max(S)=k\),考虑不包含 \(k\) 的集合 \(T\) 和 \(T\cup \{k\}\),他们的贡献会抵消掉。最后只剩一下一个集合 \(T=\{k\}\),所以式子显然成立。
由于期望的线性性,所以带上期望也是对的
那么这个就可以应用在停时问题里,比如
刚开始你有一个数字 \(0\),每一秒钟你会随机选择一个 \([0,2^n−1]\) 的数字,与你手上的数字进行或操作。选择数字 \(i\) 的概率是 \(p_i\)。问期望多少秒后,你手上的数字变成 \(2^n−1\)。
\(1\le n\le 20.\)
设 \(a_i\) 是第 \(i\) 位变成 \(1\) 的时间,那么答案即为 \(E(\max_{i=1}^{n}a_i)\),考虑套用刚刚的公式,\(E(\max_{i=1}^{n}a_i)=\sum_{T\subseteq\{1,2\dots,n\}}(-1)^{|T|-1}E(\min(T))=\sum_{T\subseteq\{1,2\dots,n\}}(-1)^{|T|-1}\dfrac{1}{\sum_{R\cap T\ne\emptyset}p_{R}}\)。
然后fmt即可。
给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去。有 \(Q\) 次询问,每次询问给定一个集合 \(S\),求如果从 \(x\) 出发一直随机游走,直到点集 \(S\) 中所有点都至少经过一次的话,期望游走几步。特别地,点 \(x\)(即起点)视为一开始就被经过了一次。
答案对 \(998244353\) 取模。\(1\le n\le 18, 1\le Q\le 5000.\)
同样的就是求点集第一次经过的时间的最大值的期望,转化为最小值的期望。
然后考虑树形dp,\(dp_{u,S}\) 代表从 \(u\) 开始到达 \(S\) 中某个点最小步数,写只有父亲的形式,具体可以看这道题的题解。
最小公倍佩尔数
令 \((1+\sqrt{2})^{n}=e(n)+f(n)\sqrt{2}\) 其中 \(e(n),f(n)\in \mathbb Z\),\(g(n)\) 是 \(f(1),f(2),\dots f(n)\) 的最小公倍数,求 \(\sum\limits_{i=1}^{n}i\times g(i)\)。
\(1\le n\le 10^6.\)
考虑 \(\text{lcm}=\prod p_i^{\max c_i}\),根据min-max容斥有 \(\text{lcm}=\prod p_i^{\sum_{s\ne \emptyset}(-1)^{|s|+1}\min_{i\in s} c_i}=\prod_{s} (\gcd_{i\in s}f_i)^{(-1)^{|s|+1}}\)。稍微推一下这个 \(f\) 发现 \(f(n)=2(f(n-1)+f(n-2))\),于是有类似斐波那契数列的性质 \(\gcd(f(a),f(b))=f(\gcd(a,b))\),所以
https://blog.csdn.net/weixin_30458043/article/details/97713305
\(E(\min(T))=\dfrac{m}{\sum p_i}\)。考虑dp,记 \(f(i,j,k)\) 前 \(i\) 个数中选 \(j\) 个出来和是 \(k\) 的方案数,\(O(n^2m)\),可以有 \(70pts\)。
把 \((-1)^{T-k}\binom{T-1}{k-1}\) 的和记进状态里,即可做到 \(O(nmk)\)。
概率生成函数
参考这里。
抽象代数
代数结构
对代数结构的研究的意义是当你解决了一个结构的问题后,可以推广到满足这个结构的任何问题。
定义 半群
对于一个集合 \(S\) 和一个二元运算 \(*\),如果其满足:
- 封闭性:\(\forall a,b\in S, a*b\in S\)。
- 结合律:\(a*(b*c)=(a*b)*c\)。
定义 群
满足半群性质。
存在单位元 \(e\),使得 \(\forall a\in S,a*e=e*a=a\)。
存在逆元,使得 \(\forall a\in S, \exist b\in S,a*b=e\)。
一个简单的类比,合数乘法是半群,质数乘法是群。
定义 交换群
又称 Abel 群。
在群的定义的基础下满足交换律。
群论
博弈
应该很少会考纯博弈题了吧。
有向图博弈,SG 定理:\(sg(x)=\text{mex}_{y}sg(y)\) 其中 \(y\) 是 \(x\) 的后继状态。
multi SG,所有起始点的 sg 函数和 \(\operatorname{xor}\)。
- 翻硬币游戏
multi-sg,每个硬币可以看作独立的游戏。
连续每次翻动向左的硬币,\(sg(x)=lowbit(x)\)。
- 阶梯 nim
有 \(n\) 个位置 \(1...n\),每个位置上有 \(a_i\) 个石子。有两个人轮流操作。操作步骤是:挑选 \(1...n\) 中任一一个存在石子的位置 \(i\),将至少 \(1\) 个石子移动至 \(i−1\) 位置(也就是最后所有石子都堆在在 \(0\) 这个位置)。谁不能操作谁输,求先手必胜还是必败。
等价于只考虑奇数位置的数的 nim 游戏,因为如果有人动了偶数位置上的数,那么另一个人就可以把这一部分挪动到奇数的位置。
- 树上删边
AGC009D Game on tree
记 \(sg(x)\) 代表 \(x\) 为根的子树的 sg 值,对于一条链 \(sg(x)=sz_x\)。否则可以看成多棵树的 multi-sg,全部异或起来即可。即 \(sg(u)=\operatorname{xor}_{v}(sg(v)+1)\)。
- 图上删边
偶环变成一个点,奇环变成一条边。
- k-nim
将异或换成 \(k+1\) 进制下的不进位加法。
SDOI 黑白棋
- 斐波那契博弈
有 \(n\) 个石子,先手取至少 \(1\) 不能全部取完,之后每个人取的数量至多为上一次的两倍。
当 \(n\) 是斐波那契数时先手必败。
之后每个人取的数量至多为上一次的 \(k\) 倍。
设 \(a\) 是所求必败态,\(b\) 是所有 \(a_{0\dots i}\) 能表示的最大的数字。
\(a_{i+1}=b_i+1\),\(b_{i+1}=a_{i+1}+b_{t}\),\(t\) 是最大的满足 \(b_t\times k<b_i\)。
-
威佐夫博弈
-
纳什均衡
格路计数问题
JLOI 骗我呢
模拟赛 不平衡度
给定一棵二叉树,对于其所有拓扑序,计算任意前缀,每个点左右子树中已经存在的点的个数之差的绝对值的最大值的最大值,求这个最大值的和。
递推关系
参考
oiwiki 数学部分
kersen 概率期望:https://www.cnblogs.com/zzz-hhh/p/14016126.html