百宝袋
杂物
类质因数分解。
对于一个值域为 \(V\),长度为 \(n\) 的数组 \(a_{\{n\}}\),可以在 \(O(n^2\log^2V)\) 的复杂度找到一个长度为 \(n\log V\) 的数组 \(c_{\{m\}}\) 满足 \(c\) 中无 1 且任意两元素互质同时对于任意 \(a_i\) 可以分解为 \(a_i=\prod\limits_{j=1}^mc_j^{p_j}\)。
这时就可以将其当作质数处理。
减半报警器。
考虑到如果 \(\sum\limits_{i=1}^ka_i=S\),则有 \(\max\limits_{i=1}^ka_i\ge \left\lceil\dfrac{S}{k}\right\rceil\)。证明是显然的。
如果一个玩意在 \(k\) 个值的和超过某一个阈值后才被激活且 \(k\) 比较小时,我们可以考虑使用这个东西。对于每一个值建堆,维护根这个值有关联的所有阈值。每次更新后检查所有可能会超阈值的监测器,没有报警的重新算一下阈值再放回去,可以发现最多检查 \(\log\) 次,所以总复杂度大约 \(O(nk\log)\)。
摩尔投票法
如果要求一个区间 \([l,r]\) 内出现次数严格超过 \(\dfrac{r-l+1}k\) 的所有数。可以考虑每次删掉 \(k\) 个不同的数,最后剩下的不同的不超过 \(k-1\) 种,显然,这里面就包含了我们要找的答案。这个可以用线段树与其他分治数据结构实现。
但是摩尔投票的问题是答案一定能被找到,找到的不一定是答案,如果题目给了 Spj 就没什么,如果没有的话就要自己再检查一次。
变进制数
对于一个排列,我们发现其排名本质是一个位值从高到低为 \(n,n-1,\cdots,1\) 的一个变进制数,每一位的值是在其后的比它小的数的个数。
比如一个长度为 5 的排列 \(1,4,2,5,3\),对应的变进制数是 \(\overline{02010}=13\),同时它的后继为 \(1,4,3,2,5\),对应 \(\overline{02100}=14\)。
发现求排列的后继时,大规模改动的位置长度不会超过 17(\((17!)=355,687,428,096,000\))。
所以可以直接模拟维护改动的位置。
另外,如果求 \(X\mod \prod\limits_{i=1}^ab_i(a=\overline{1,2,\cdots,n})\),可以考虑将 \(X\) 表示为位值从低到高为 \(b_1,b_2,\cdots\) 的变进制数并求每一个后缀对应的数。
一个经典的组合意义套路
一个数组,一个划分方案 \(S\) 的价值为 \(\prod\limits_{v\in S}\sum\limits_{i\in v}a_i\),求所有合法方案的权值和。
那么考虑一个组合意义是每个划分的集合 \(v\) 中 \(\sum\limits_{i\in v}a_i\) 个元素中选一个,然后再看看怎么 dp。
欧拉降幂
众所周知: \(a^b \equiv\begin{cases}a^b & b<\varphi(m)\\a^{b\bmod \varphi(m)+\varphi(m) } & b\ge\varphi(m)\end{cases}\pmod m\)。
同时,当 \(n>2\) 时,有 \(2\mid\varphi(n)\) 以及 \(\varphi(2^kn)=2^{k-1}\varphi(n)\le\dfrac{\varphi(n)}2(2\nmid n)\)。所以易得对 \(n\) 求 \(\log\) 次 \(\varphi\) 后其值固定为 1。
可以用来解决一些关于幂塔的问题。
zak 讲的区间线性基新做法
常规的区间线性基可以使用一些简单的数据结构如线段树或平衡树做到 \(O(\log^3)\) 的一次查询。
但是我们可以有如下考虑:
显然我们的线性基大小是 \(O(\log V)\) 的所以我们考虑随机 100 个区间内元素的线性组合,这样就是 \(O(100\log)\approx O(\log^2)\) 的了。
可以轻松通过[Ynoi2013] 无力回天 NOI2017和CF587E。
看 zak 博客看到的二进制报警器
看不懂。后面补。
记一些常用的数学工具
- 组合数 \({n\choose m}=\dfrac{n!}{(n-m)!m!}\),有 \({n\choose m}={n-1\choose m}+{n-1\choose m-1}\)。
- 第一类斯特林数 \({n\brack m}\),表示将 \(n\) 个不同的数分为 \(m\) 个环排列的方案数,有 \({n\brack m}={n-1\brack m}\times(n-1)+{n-1\brack m-1}\)。
- 第二类斯特林数 \({n\brace m}\),表示将 \(n\) 个不同的数分为 \(m\) 个集合的方案数,有 \({n\brace m}={n-1\brace m}\times m+{n-1\brace m-1}\)。
- 欧拉数 \(\left\langle\begin{smallmatrix}n\\m\end{smallmatrix}\right\rangle\),表示所有 \(1\sim n\) 的排列中,恰有 \(m\) 个数比前一个数大的排列数,有 \(A(n,m)=A(n-1,m)\times(m+1)+A(n-1,m-1)\times(n-m)\)。
同时我们对于第二类斯特林数和欧拉数有线性求值公式:
然后这些还大多存在 \(Polylog(n)\) 的一行或一列的求法。
Raney 引理
一个神奇的东西,记一下:如果有一个整数序列 \(x_{1,n}\) 满足 \(\sum\limits_{i=1}^nx_i=1\),那么有且仅有一个与 \(x_{1,n}\) 的循环同构的数组 \(x'_{1,n}\) 满足 \(\forall i\in[1,n],\sum\limits_{j=1}^ix'_i>0\)。
证明略。
考虑这玩意的应用:如果我们有一堆整数 \(x_1,x_2,\cdots,x_n\) 满足 \(\sum x_i=1\),那么把 \(x\) 的所有排列按循环同构划分等价类之后每个等价类中就只会有一个符合要求的排列。
洛谷专栏。
关于树的重心的一些结论
考虑一个几乎显然的结论:重心(不唯一时取深度较浅的一个)的子树 \(siz\) 一定严格大于总权值和的一半,证明可以考虑分析将重心移到其父亲带来的变化。
所以我们考虑求出原树的一个 \(dfs\) 序,维护一个序列 \(A\),如果 \(dfs\) 序第 \(i\) 为对应的点如果为 \(x\),那么就在 \(A\) 的末尾写 \(val_x\) 个 \(x\)。最后考虑 \(A\) 的中位数,因为重心 \(X\) 的子树和大于总的一半,所以序列的中位数对应的点一定在重心的子树内,我们再倍增去跳第一个满足子树大小大于一半的点即是重心。
我们发现 \(355071375\times2^{48}+1=9,9943,707,008,745,603,072,001\) 是一个 NTT 模数,而且接近 \(10^{23}\) 数量级,我们可以手搓一个 __int128 的乘法后直接 NTT。

浙公网安备 33010602011771号