一些笔记
前身:高一时的笔记
密码也是 Leave All Behind,其实是这个(
笔记。不是都有用。当遗产了,觉得有有用的部分拿走就好(
回文树不基于势能分析的插入算法有空需要学一下
APIO2014回文串的SAM解法
-
当线段树合并要求在所有节点均合并完后仍能查询任意节点的信息时(要求在合并时不能销毁子节点):
考虑用类似主席树的做法,在每次合并的时候新开一个节点Code:
int merge(int p1, int p2, int tl, int tr) { // cout<<"merge: "<<p1<<' '<<p2<<' '<<tl<<' '<<tr<<endl; if (!(p1&&p2)) return p1|p2; if (tl==tr) return p1; int mid=(tl+tr)>>1, t=++tot; ls(t)=merge(ls(p1), ls(p2), tl, mid); rs(t)=merge(rs(p1), rs(p2), mid+1, tr); return t; }
-
同余最短路记得特判base=1的情况
-
在 \(\bmod\ a\) 意义下,公差为 \(b\) 的等差数列将所有 \([0,a-1]\) 中的元素划分为 \(\gcd(a,b)\) 个等价类
证明:\(min\{k\mid kb\equiv 0\pmod a\}=\frac{a}{\gcd(a, b)}\),所以每个等价类大小为 \(\frac{a}{\gcd(a, b)}\)
故有 \(\gcd(a, b)\) 个等价类 -
在一个序列中,如果一个数 \(x\) 出现了 \(d\) 次
那么我们从小到大每隔 \(d-1\) 个数取出一个数(即取出第 \(1,1+d,1+2d,\cdots\) 小的数),\(x\) 必定出现在所有取出的数中
这个结论是显然的,因为如果 \(x\) 没有出现,那么 \(x\) 在整个区间的出现次数最多为 \(d-1\)
应用这里 -
求区间内未出现过的最小自然数(区间mex):
主席树,\(rot_r\) 维护区间 \([1, r]\) 内每个权值上次出现位置的最小值
查询时若左区间最小值 \(<l\) 则向左递归 -
某些动态连边要求维护lca/多测且需要求lca的题的一个坑点:这里
说人话就是写成下面这样:for (int i=1; i<25; ++i) if (dep[u]>=1<<i) fa[i][u]=fa[i-1][fa[i-1][u]]; else fa[i][u]=0;
-
当出现要求很多个数的乘积的欧拉函数时,可以用 \(\varphi (n)=n\times\prod\limits_{i=1}^k\frac{p_i-1}{p_i}\) 转化为统计不同质因子个数
-
区间mex可以转为可持久化权值线段树存每个权值上一次出现的位置
查询就线段树上二分第一个上次出现的位置小于 \(l\) 的权值,见这里 -
关于形如「一个集合 \(S\) 的所有子集的和的mex」的限制:
首先容易转化为求值域上第一个不连续位置
然后有一个性质:维护的最长值域连续段长度每次至少 \(\times 2\),所以这个维护过程如果用线段树做的话可以做到 \(O(log^2n)\) -
关于多次询问,每次求一个区间的中位数:
有一个套路是二分这个中位数,设当前二分到值是 \(mid\),将区间中 \(\geqslant mid\) 的数设为1,\(<mid\) 的数设为-1
则区间中位数 \(\geqslant mid\) 的条件是区间和 \(\geqslant 0\)(这里的所有等号需要因题而宜)
可以用主席树维护每个 \(mid\) 对应的序列(mid+1时只有 \(=mid\) 的数会从-1变为1),则可以 \(O(logn)\) 查询 -
像[AH2017/HNOI2017]影魔这样贡献总共分为两种(点/点,点/区间)的题若强制在线:
可以将贡献挂到其中的点而非区间上,这样就可以主席树查询一个原序列上区间内的贡献了
仅对这个题而言,貌似将「每次询问只有区间内的点能产生贡献」的限制用「将贡献挂在一个点上,另一个点的限制用主席树下标实现」的方式处理掉了 -
ETT在split的时候(所有FHQ需要记录fa的情况在split的时候)要记得将当前节点的fa清零
-
注意可持久化trie中记录的若是前缀和,那么在 \(rot[0]\) 处也要ins一个0进去
-
给定一个序列,求出所有 \(l_i, r_i\) 使得 \(i\) 在 \([l_i, i]\) 及 \([i, r_i]\) 中均为次大值:
用双向链表维护序列,从小到大删除即可 -
主席树统计区间特殊点对的时候注意若插入了 \(r[i]=n+1\) 的点可能导致越界
-
https://www.cnblogs.com/avril/archive/2012/11/13/2767577.html
-
需要注意一个事情:常用的splay板子在rorate的时候可能会修改 \(fa[0]\)
-
\(\varphi(ab)=\frac{\varphi(a)\varphi(b)gcd(a, b)}{\varphi(gcd(a, b))}\)
-
对偶图优化平面图最大流/最小割:这里
-
胡伯涛《最小割模型在信息学竞赛中的应用》中 最大密度子图 鸽了
-
在棋盘上向四个/八个方向移动,将棋盘每两行拆开可以使每两行的行走间完全独立
-
不存在 \(a, b\) 均为奇数使 \(a^2+b^2=c^2\)
证明:奇数的平方和在模 4 意义下一定是 2, 而完全平方数在模 4 意义下必须是 0/1. 枚举 \([0,4)\) 之间的数字就证完了
意义是在特殊限制下构建二分图 -
关于网络流中形如「每个点恰好经过一次」的限制:
因为每个点恰好经过一次,可以将每个点拆为 \((x, y)\)
从源点向 \(x\) 连流量为1的边代表只会从这个点出发一次
从 \(y\) 向汇点连流量为1的边代表恰好到达这个点一次
剩下从 \(x_u\) 向 \(y_v\) 按题意连边,强制流量为n即可
有个比较形象的解释 -
二分图中最小边染色数等于顶点的最大度数
-
关于「每个点指向另一个点,从任意一点出发,经过若干步之后能重新回到此点」:应当注意到每个的点的入度和出度都恰好为1
-
广义最小费用流问题中,当费用和流量成正比时(充分非必要),最优解一定在流量都是整数的情况下取到
-
01BFS需要学一下
-
如果一个网络流题里的点被分为了 \(n\) 个部分,那么一个非常隐式的条件可能是要在图中用 \(n\) 条路径覆盖所有节点
-
有关最小割的一些性质:
- 不是满流的边一定不是任意一个最小割中的边
- 在残量网络中求出强连通分量,则两个端点在同一强连通分量中的边一定不是任意最小割中的边
证明:在残量网络中推一下流这条边就不满流了 - 在残量网络中求出强连通分量,则两个端点不在同一个强连通分量中的边是最小割的可行边
- 在残量网络中求出强连通分量,则一个端点在 \(s\) 所在强连通分量,一个端点在 \(t\) 所在强连通分量中的边是最小割的必须边
-
当前弧优化一定不要忘了写
-
形如「每种贡献/代价至多产生一次」的限制:尝试构造最大权闭合子图
-
辗转相除高斯消元是可以通过只算系数做到 \(O(n^3+n^2logn)\) 的
-
当在要求输出浮点数的题目中,\(\frac{1}{eps}\) 可以近似看做0的逆元,
我也不知道为啥精度不会炸 -
有向树矩阵数定理:外向树用入度,内向树用出度
-
同一个图的每个最小生成树中,边权相等的边数量相等
-
同一个图的不同的生成树中,删去任意一种权值的所有边后,形成的联通块状态是一样的(?)
-
注意当模数由输入给定时若 \(n \equiv 0 \pmod p\) 可能出现许多需要特判的无解情况
-
\(a\times t \equiv b\times t \pmod{p\times t} \rightarrow a\equiv b \pmod p\),
-
多元二项式定理:\((x_1 + \dots + x_m)^p = \sum\limits_{\substack{c_i \ge 0 ,\ \sum_{i=1}^m c_i = p}} \binom{p}{c_1, c_2, \cdots ,c_m}\cdot \prod_{i=1}^m{x_i}^{c_i}\)
-
\(\sum\limits_{i=1}^n i^3 = (\frac{n(n+1)}{2})^2\)
-
\(\sum i^k\) 的求法
-
\(\sum\sum \mu(ij)\) 也是可以求的,过程夹在蓝书里了
-
注意 \(\sum\limits_{d \mid n} d = \sum\limits_{d \mid n} \frac{n}{d}\) 常用于消项
-
完全二分图的生成树个数为 \(n^{m-1}m^{n-1}\),证明这里
-
高斯消元辗转相除法 \(O(n^3)\) 的复杂度分析:等价于 \(n\) 次 \(a_{i,i}\) 与所有 \(a_{j,i}\) 求一次gcd的复杂度
-
当 \(n>1e9\) 时,注意快速幂等函数都要在进入时取模!
-
\(Fib_{n+m}=Fib_{m−1}∗Fib_{n}+Fib_m∗Fib_{n+1}\)
-
有 \(F(n)=\sum\limits_{d\mid n} d^k G(\frac{n}{d})\),可得 \(G(n)=\sum\limits_{d\mid n} \mu(d) d^k F(\frac{n}{k})\),来自战神的证明夹在蓝书里了
-
\(n^k = \sum\limits_{i=0}^{min(n, k)}\begin{Bmatrix}k\\i\end{Bmatrix}\binom{n}{i}i!\)
\(n^k\) 是将 \(k\) 个不同球放入 \(n\) 个不同盒子,允许盒子为空的方案数
\(\binom{n}{i}i!\) 为从 \(n\) 个盒子中有顺序地选 \(i\) 个盒子的方案数,我们钦定这 \(i\) 个盒子非空
\(\begin{Bmatrix}k\\i\end{Bmatrix}\) 为将这 \(k\) 个球放入选中的 \(i\) 个盒子
可以搭配 \(\binom{n}{i}=\binom{n-1}{i}+\binom{n-1}{i-1}\) 进行递推,例题 -
斯特林数处理连续幂次和可以避免求逆元
-
\(g(n)=\prod\limits_{d\mid n}f(d)\),有 \(f(n)=\prod\limits_{d\mid n}g(\frac{n}{d})^{\mu(d)}\)
证明可以用与求和类似的方法推,也有一种理解方法是将 \(\mu\) 放到指数上后 \(\mu\) 仍然在与和式一样的位置产生贡献
只不过贡献是以 \(f(d)\times f(d)^{-1}\) 的形式消掉的,所以最后产生的贡献不变 -
不取模的FFT快速幂可以直接在点值表示下对每个点快速幂做到 \(O(nlogn)\)
-
统计无向连通图方案数:
令 \(f(n)\) 为点数为 \(n\) 的无向连通图的数量, \(g(n)\) 为点数为 \(n\) 无向图数量
则有 \(g(n)=\sum\limits_{i=1}^n \binom{n-1}{i-1}f(i)g(n-i)=2^{\frac{n(n-1)}{2}}\)
变形即得 \(f(n)\) 表达式 -
搜生成树的时候可以dfs加点,这样复杂度就是(大约) \(O(n!m)\) 而不是 \(O(m!n)\) 了
-
fft要开两倍数组!
-
点分治递归solve的时候是
solve(rot)
不是solve(v)
! -
形如 \(f_i(k)=x_i+y_i+kx_i+\frac{y_i}{k}\) 的式子其实是有实际意义的,见这里
-
对原有定义过比较函数的内置类型重载运算符的作用域十分有限且奇怪,不建议使用
-
树状数组维护单调栈
-
两天就忘系列:\(kth\_max(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-k}\binom{|T|-1}{k-1}min(T)\)
-
关于求 \(\sum\limits_{T\cap S=\varnothing} a_T\):
补集转化为求 \(sum-\sum\limits_{T\cup (U-S)\neq \varnothing}a_T\)
后面那个等价于求 \(\sum\limits_{T\cup (U-S)=U-S}a_T\),可以FWT优化 -
有
isnan()
和isinf()
这两个函数,作用字面义 -
遍历bitset:
s._Find_first()
和s._Find_next(now)
,后面这个如果没有next返回end()
,也即size+1
-
关于树状数组维护区间乘积:
ans=query(r)*inv(query(l-1));
-
费马平方和定理:奇素数 \(p\)可以表示为两个正整数的平方和,当且仅当 \(p\) 是 \(4k+1\) 型的。
并且在不考虑两个正整数顺序的情况下,这个表示方法唯一。
应用:求勾股数等 -
关于构造原生勾股数:见2019集训队论文(关于整点计数的那篇)
-
形如 \(val_i=\max\{a_j*x_i+b_j*y_i\}\) 的式子,可以转化成 \(\frac{val_i}{y_i}=\max\{a_j*\frac{x_i}{y_i}+b_j\}\) 求解
-
IO交互题记得输出换行!
-
2-sat 问题若用dfs实现,可以缩点之后压位传递闭包做到 \(O(\frac{nm}{w})\)
-
带环的传递闭包可以先缩点
-
2-sat 钦定变量的选法:对应加边即可 \(x_0 \rightarrow x_1\) 或 \(x_1 \rightarrow x_0\)
-
如果用线段树代替平衡树查第 \(k\) 大,记得线段树下标要从0开始
-
对于一类「无向图上距离恰好/至少为 \(k\)」的问题,有一步转化是建出 SPT,转化为树上问题
-
虽然 LCT 的复杂度是均摊的,但是 LCT 有删除操作可以用于回退
-
许多看起来需要根号分治的题也可以线段树分治
-
SAM 上的转移边形成的 DAG 具有特殊性质:两条路径要么终点不同,要么长度不同
而 SAM 上本质不同子串与本质不同路径一一对应
对于每个节点,以这个节点为终点的路径数是 \(len_i-len_{fail_i}\)
所以本质不同子串数是 \(\sum len_i-len_{fail_i}\) -
写 SAM 记得写
init();
-
data 在 c++20 中是关键字
markdown
前身:[高一时的笔记](https://www.cnblogs.com/narration/p/14918901.html)
密码这个(
![image](https://img2023.cnblogs.com/blog/2381538/202301/2381538-20230128141636930-883659495.png)
笔记。不是都有用。当遗产了,觉得有有用的部分拿走就好(
回文树不基于势能分析的插入算法有空需要学一下
APIO2014回文串的SAM解法
* 当线段树合并要求在所有节点均合并完后仍能查询任意节点的信息时(要求在合并时不能销毁子节点):
考虑用类似主席树的做法,在每次合并的时候新开一个节点
<details>
<summary>Code:</summary>
```cpp
int merge(int p1, int p2, int tl, int tr) {
// cout<<"merge: "<<p1<<' '<<p2<<' '<<tl<<' '<<tr<<endl;
if (!(p1&&p2)) return p1|p2;
if (tl==tr) return p1;
int mid=(tl+tr)>>1, t=++tot;
ls(t)=merge(ls(p1), ls(p2), tl, mid);
rs(t)=merge(rs(p1), rs(p2), mid+1, tr);
return t;
}
```
</details>
* 同余最短路记得特判base=1的情况
* 在 $\bmod\ a$ 意义下,公差为 $b$ 的等差数列将所有 $[0,a-1]$ 中的元素划分为 $\gcd(a,b)$ 个等价类
证明:$min\{k\mid kb\equiv 0\pmod a\}=\frac{a}{\gcd(a, b)}$,所以每个等价类大小为 $\frac{a}{\gcd(a, b)}$
故有 $\gcd(a, b)$ 个等价类
* 在一个序列中,如果一个数 $x$ 出现了 $d$ 次
那么我们从小到大每隔 $d-1$ 个数取出一个数(即取出第 $1,1+d,1+2d,\cdots$ 小的数),$x$ 必定出现在所有取出的数中
这个结论是显然的,因为如果 $x$ 没有出现,那么 $x$ 在整个区间的出现次数最多为 $d-1$
应用[这里](https://www.luogu.com.cn/blog/AlexWei/solution-cf840d)
* 求区间内未出现过的最小自然数(区间mex):
主席树,$rot_r$ 维护区间 $[1, r]$ 内每个权值上次出现位置的最小值
查询时若左区间最小值 $<l$ 则向左递归
* 某些动态连边要求维护lca/多测且需要求lca的题的一个坑点:[这里](https://www.luogu.com.cn/blog/IC-QQQ/solution-p3302)
说人话就是写成下面这样:
```cpp
for (int i=1; i<25; ++i)
if (dep[u]>=1<<i) fa[i][u]=fa[i-1][fa[i-1][u]];
else fa[i][u]=0;
```
* 当出现要求很多个数的乘积的欧拉函数时,可以用 $\varphi (n)=n\times\prod\limits_{i=1}^k\frac{p_i-1}{p_i}$ 转化为统计不同质因子个数
* 区间mex可以转为可持久化权值线段树存每个权值上一次出现的位置
查询就线段树上二分第一个上次出现的位置小于 $l$ 的权值,见[这里](https://www.luogu.com.cn/problem/P4137)
* 关于形如「一个集合 $S$ 的所有子集的和的mex」的限制:
首先容易转化为求值域上第一个不连续位置
然后有一个性质:维护的最长值域连续段长度每次至少 $\times 2$,所以这个维护过程如果用线段树做的话可以做到 $O(log^2n)$
* 关于多次询问,每次求一个区间的中位数:
有一个套路是二分这个中位数,设当前二分到值是 $mid$,将区间中 $\geqslant mid$ 的数设为1,$<mid$ 的数设为-1
则区间中位数 $\geqslant mid$ 的条件是区间和 $\geqslant 0$(这里的所有等号需要因题而宜)
可以用主席树维护每个 $mid$ 对应的序列(mid+1时只有 $=mid$ 的数会从-1变为1),则可以 $O(logn)$ 查询
* 像[[AH2017/HNOI2017]影魔](https://www.luogu.com.cn/problem/P3722)这样贡献总共分为两种(点/点,点/区间)的题若强制在线:
可以将贡献挂到其中的点而非区间上,这样就可以主席树查询一个原序列上区间内的贡献了
仅对这个题而言,貌似将「每次询问只有区间内的点能产生贡献」的限制用「将贡献挂在一个点上,另一个点的限制用主席树下标实现」的方式处理掉了
* ETT在split的时候(所有FHQ需要记录fa的情况在split的时候)要记得将当前节点的fa清零
* 注意可持久化trie中记录的若是前缀和,那么在 $rot[0]$ 处也要ins一个0进去
* 给定一个序列,求出所有 $l_i, r_i$ 使得 $i$ 在 $[l_i, i]$ 及 $[i, r_i]$ 中均为次大值:
用双向链表维护序列,从小到大删除即可
* 主席树统计区间特殊点对的时候注意若插入了 $r[i]=n+1$ 的点可能导致越界
* https://www.cnblogs.com/avril/archive/2012/11/13/2767577.html
* 需要注意一个事情:常用的splay板子在rorate的时候可能会修改 $fa[0]$
* $\varphi(ab)=\frac{\varphi(a)\varphi(b)gcd(a, b)}{\varphi(gcd(a, b))}$
* 对偶图优化平面图最大流/最小割:[这里](https://www.cnblogs.com/jinkun113/p/9495308.html)
* [最小点权覆盖集/最大点权独立集](https://blog.csdn.net/zjsyhjh/article/details/27100583)
* 胡伯涛《最小割模型在信息学竞赛中的应用》中 最大密度子图 鸽了
* 在棋盘上向四个/八个方向移动,将棋盘每两行拆开可以使每两行的行走间完全独立
* 不存在 $a, b$ 均为奇数使 $a^2+b^2=c^2$
证明:奇数的平方和在模 4 意义下一定是 2, 而完全平方数在模 4 意义下必须是 0/1. 枚举 $[0,4)$ 之间的数字就证完了
意义是在特殊限制下构建二分图
* 关于网络流中形如「每个点恰好经过一次」的限制:
因为每个点恰好经过一次,可以将每个点拆为 $(x, y)$
从源点向 $x$ 连流量为1的边代表只会从这个点出发一次
从 $y$ 向汇点连流量为1的边代表恰好到达这个点一次
剩下从 $x_u$ 向 $y_v$ 按题意连边,强制流量为n即可
有个比较形象的[解释](https://www.luogu.com.cn/blog/George1123/solution-p2469#)
* 二分图中最小边染色数等于顶点的最大度数
* 关于「每个点指向另一个点,从任意一点出发,经过若干步之后能重新回到此点」:应当注意到每个的点的入度和出度都恰好为1
* 广义最小费用流问题中,当费用和流量成正比时(充分非必要),最优解一定在流量都是整数的情况下取到
* 01BFS需要学一下
* 如果一个网络流题里的点被分为了 $n$ 个部分,那么一个非常隐式的条件可能是要在图中用 $n$ 条路径覆盖所有节点
* 有关最小割的一些性质:
1. 不是满流的边一定不是任意一个最小割中的边
2. 在残量网络中求出强连通分量,则两个端点在同一强连通分量中的边一定不是任意最小割中的边
证明:在残量网络中推一下流这条边就不满流了
3. 在残量网络中求出强连通分量,则两个端点不在同一个强连通分量中的边是最小割的可行边
4. 在残量网络中求出强连通分量,则一个端点在 $s$ 所在强连通分量,一个端点在 $t$ 所在强连通分量中的边是最小割的必须边
* 当前弧优化一定不要忘了写
* 形如「每种贡献/代价至多产生一次」的限制:尝试构造最大权闭合子图
* 辗转相除高斯消元是可以通过只算系数做到 $O(n^3+n^2logn)$ 的
* 当在要求输出浮点数的题目中,$\frac{1}{eps}$ 可以近似看做0的逆元,~~我也不知道为啥精度不会炸~~
* 有向树矩阵数定理:外向树用入度,内向树用出度
* 同一个图的每个最小生成树中,边权相等的边数量相等
* 同一个图的不同的生成树中,删去任意一种权值的所有边后,形成的联通块状态是一样的(?)
* [Catalan数经典问题](https://blog.csdn.net/weixin_43601103/article/details/87467570)
* 注意当模数由输入给定时若 $n \equiv 0 \pmod p$ 可能出现许多需要特判的无解情况
* $a\times t \equiv b\times t \pmod{p\times t} \rightarrow a\equiv b \pmod p$,
* [等比数列求和公式](https://blog.csdn.net/weixin_43890363/article/details/100884914)
* 多元二项式定理:$(x_1 + \dots + x_m)^p = \sum\limits_{\substack{c_i \ge 0 ,\ \sum_{i=1}^m c_i = p}} \binom{p}{c_1, c_2, \cdots ,c_m}\cdot \prod_{i=1}^m{x_i}^{c_i}$
* $\sum\limits_{i=1}^n i^3 = (\frac{n(n+1)}{2})^2$
* $\sum i^k$ 的[求法](https://www.cnblogs.com/Wolfycz/p/10622577.html)
* $\sum\sum \mu(ij)$ 也是可以求的,过程夹在蓝书里了
* 注意 $\sum\limits_{d \mid n} d = \sum\limits_{d \mid n} \frac{n}{d}$ 常用于消项
* [完全二分图的生成树个数](https://darkbzoj.tk/problem/4766)为 $n^{m-1}m^{n-1}$,证明[这里](https://blog.csdn.net/qq_34564984/article/details/60593011)
* [高斯消元辗转相除法 $O(n^3)$ 的复杂度分析](https://blog.csdn.net/m0_51483033/article/details/118196604):等价于 $n$ 次 $a_{i,i}$ 与所有 $a_{j,i}$ 求一次gcd的复杂度
* 当 $n>1e9$ 时,注意快速幂等函数都要在进入时取模!
* $Fib_{n+m}=Fib_{m−1}∗Fib_{n}+Fib_m∗Fib_{n+1}$
* 有 $F(n)=\sum\limits_{d\mid n} d^k G(\frac{n}{d})$,可得 $G(n)=\sum\limits_{d\mid n} \mu(d) d^k F(\frac{n}{k})$,来自战神的证明夹在蓝书里了
* 几个常见的杜教筛套路在[这里](https://www.luogu.com.cn/blog/command-block/du-jiao-shai)以及[这里](https://www.cnblogs.com/narration/p/15227158.html)
* $n^k = \sum\limits_{i=0}^{min(n, k)}\begin{Bmatrix}k\\i\end{Bmatrix}\binom{n}{i}i!$
$n^k$ 是将 $k$ 个不同球放入 $n$ 个不同盒子,允许盒子为空的方案数
$\binom{n}{i}i!$ 为从 $n$ 个盒子中有顺序地选 $i$ 个盒子的方案数,我们钦定这 $i$ 个盒子非空
$\begin{Bmatrix}k\\i\end{Bmatrix}$ 为将这 $k$ 个球放入选中的 $i$ 个盒子
可以搭配 $\binom{n}{i}=\binom{n-1}{i}+\binom{n-1}{i-1}$ 进行递推,[例题](https://www.luogu.com.cn/problem/P4827)
* [一个比较详细的斯特林数总结](https://www.cnblogs.com/heyuhhh/p/12051119.html)以及[斯特林数的一堆性质](https://www.cnblogs.com/newbielyx/p/12109454.html)
* [image](https://img2020.cnblogs.com/blog/2381538/202201/2381538-20220103163549985-121502556.png)
* 斯特林数处理连续幂次和可以避免求逆元
* $g(n)=\prod\limits_{d\mid n}f(d)$,有 $f(n)=\prod\limits_{d\mid n}g(\frac{n}{d})^{\mu(d)}$
证明可以用与求和类似的方法推,也有一种理解方法是将 $\mu$ 放到指数上后 $\mu$ 仍然在与和式一样的位置产生贡献
只不过贡献是以 $f(d)\times f(d)^{-1}$ 的形式消掉的,所以最后产生的贡献不变
* 不取模的FFT快速幂可以直接在点值表示下对每个点快速幂做到 $O(nlogn)$
* 统计无向连通图方案数:
令 $f(n)$ 为点数为 $n$ 的无向连通图的数量, $g(n)$ 为点数为 $n$ 无向图数量
则有 $g(n)=\sum\limits_{i=1}^n \binom{n-1}{i-1}f(i)g(n-i)=2^{\frac{n(n-1)}{2}}$
变形即得 $f(n)$ 表达式
* 搜生成树的时候可以dfs加点,这样复杂度就是(大约) $O(n!m)$ 而不是 $O(m!n)$ 了
* fft要开两倍数组!
* 点分治递归solve的时候是 `solve(rot)` 不是 `solve(v)` !
* 整数三分 https://www.cnblogs.com/lukelmouse/p/12545973.html
* 形如 $f_i(k)=x_i+y_i+kx_i+\frac{y_i}{k}$ 的式子其实是有实际意义的,见[这里](https://www.luogu.com.cn/problem/solution/P3291)
* [区间加等差数列,查询区间最大值](https://www.luogu.com.cn/problem/P4192)
* 对原有定义过比较函数的内置类型重载运算符的作用域十分有限且奇怪,不建议使用
* 树状数组维护单调栈
* 两天就忘系列:$kth\_max(S)=\sum\limits_{T\subseteq S}(-1)^{|T|-k}\binom{|T|-1}{k-1}min(T)$
* 关于求 $\sum\limits_{T\cap S=\varnothing} a_T$:
补集转化为求 $sum-\sum\limits_{T\cup (U-S)\neq \varnothing}a_T$
后面那个等价于求 $\sum\limits_{T\cup (U-S)=U-S}a_T$,可以FWT优化
* 有 `isnan()` 和 `isinf()` 这两个函数,作用字面义
* [浅谈树状数组的优化及扩展](https://www.luogu.com.cn/blog/countercurrent-time/qian-tan-shu-zhuang-shuo-zu-you-hua)
* 遍历bitset:`s._Find_first()` 和 `s._Find_next(now)`,后面这个如果没有next返回 `end()`,也即 `size+1`
* 关于树状数组维护区间乘积:`ans=query(r)*inv(query(l-1));`
* 费马平方和定理:奇素数 $p$可以表示为两个正整数的平方和,当且仅当 $p$ 是 $4k+1$ 型的。
并且在不考虑两个正整数顺序的情况下,这个表示方法唯一。
应用:求勾股数等
* 关于构造原生勾股数:见2019集训队论文(关于整点计数的那篇)
* 形如 $val_i=\max\{a_j*x_i+b_j*y_i\}$ 的式子,可以转化成 $\frac{val_i}{y_i}=\max\{a_j*\frac{x_i}{y_i}+b_j\}$ 求解
* IO交互题记得输出换行!
* 2-sat 问题若用dfs实现,可以缩点之后压位传递闭包做到 $O(\frac{nm}{w})$
* 带环的传递闭包可以先缩点
* 2-sat 钦定变量的选法:对应加边即可 $x_0 \rightarrow x_1$ 或 $x_1 \rightarrow x_0$
* 如果用线段树代替平衡树查第 $k$ 大,记得线段树下标要从0开始
* 对于一类「无向图上距离恰好/至少为 $k$」的问题,有一步转化是建出 SPT,转化为树上问题
* 虽然 LCT 的复杂度是均摊的,但是 LCT 有删除操作可以用于回退
* 许多看起来需要根号分治的题也可以线段树分治
* SAM 上的转移边形成的 DAG 具有[特殊性质](https://www.luogu.com.cn/blog/hehelego/solution-p4070):两条路径要么终点不同,要么长度不同
而 SAM 上本质不同子串与本质不同路径一一对应
对于每个节点,以这个节点为终点的路径数是 $len_i-len_{fail_i}$
所以本质不同子串数是 $\sum len_i-len_{fail_i}$
* 写 SAM 记得写 `init();`
* data 在 c++20 中是关键字