Loading

tricks/结论

  1. 模数不为质数,要除一个数,保证除出来时整数,但是被除数太大了必须中途取模,这时可以将 \(mod\) 乘以除数,边乘被除数边取模,最后答案再除掉除数(常用于组合数的运算)。
    假设原本的模数为 \(m\), 要求 \(\dfrac{a}{b} \mod m\), 设 \(a = k \times b \cdot m + r, \dfrac{a}{b} \equiv ans \pmod m, \dfrac{a}{b} = ans + qm, (k, q \in \mathbb{N^*}))\)

可以得到 $$\large{a = k \times b \cdot m + r = (ans + qm) \cdot b}$$

\[\large{r=(ans+m\cdot(q-k)) \cdot b} \]

\[\large{\dfrac{r}{b}\equiv ans \pmod m} \]

所以是正确的。

  1. 考虑一个 dp: \(\large{dp_{i,k}=dp_{i-1,k \oplus a_{i}}} (\sum a_i \le m)\), 类似这样的方程如果直接做第二维是值域, 复杂度是 \(O(nm)\) 的.

如果我们考虑将 \(a\) 升序排序, 那么令 \(up_x\)\(2^{\lceil\log(x)\rceil} - 1\), 则 \(up_x < 2 \times x\), 然后做 dp 的时候,前 \(i\) 个数的异或和肯定 \(\le up_{a_i}\), 故第二维只要枚举到 \(up_{a_i}\), 那么时间复杂度就降到了 \(O(n+\sum up_{a_i})=O(n+m)\), 空间复杂度是 \(O(\max up_{a_i})\), 有类似性质的,如 or, and 都可以用这个方法

  1. \(axy+bx+cy=0\) 的整数解: \(a^2xy+abx+acy+bc=bc \Rightarrow (ax+b)(ay+c)=bc\), 然后枚举 \(bc\) 因数即可。

  2. 对于最小生成树,其实不管什么算法,都有很多边的尝试是完全多余的,可以考虑只用有用的边,比如 https://www.luogu.com.cn/problem/P2076

  3. 经典结论:如果 \(\forall i \in [0, n), i \rightarrow (i + x) \bmod n\) 连边, 则会有 \(\gcd(x, n)\) 个等大的连通块
    证明:考虑 \(p=0\), 每次 \(+x, \mod n\), 不断跳直到重新为 \(0\), 加的 \(x\) 总和就是 \(\mathrm{lcm(n, x)}\), 有 \(\dfrac{\mathrm{lcm(n,x)}}{x}\) 个点连在一起, \(p\) 等于其它同理,所以共有 \(\dfrac{n}{\dfrac{\mathrm{lcm(n,x)}}{x}} = \gcd(n, x)\) 个连通块。

  4. 写 gcd 的时候可以先预处理 1000 以内的 gcd,然后大的很快可以辗转相除下来,常数可以小。

  5. P7322 「PMOI-4」排列变换 这题不考虑算重非常简单,去重的工作可以容斥,而这个容斥,可以注意到一个非常重要的东西:如果有多个地方,只要考虑第一个,并且第二个成立的区间肯定是接着第一个的,总的符合的也是一个区间,这样就可以直接考虑推柿子,求出重复(即如果 \(i \in [l, l + k - 1]\)\(\max = i\), 那么减去 \(i \in [l + 1, l + k] \land \max = i\) 的情况,这里由于是全排列可以直接算概率。

  6. 一些可能要可持久化的题,可能可以按时间戳建树,然后跳时间就是连边,离线下来处理。比如可持久化并查集的板子,这样做可以只用可撤销并查集。

  7. https://qoj.ac/contest/1259/problem/6631 遇到这种题,发现样例的第二个答案只有 0/1/2, 此时一定要打个表看看是否答案恒 \(\le 2\), 然后想办法构造,构造不了也应该硬猜一下,而且这题可以构造。

  8. https://www.cnblogs.com/zhyh/p/15802449.html
    有时尺取法删除不好做,比如 \(\gcd\)\(\max\), 这时可以考虑开两个栈维护队列,维护当前区间的 \(l, mid, r\), 记一个 \(res_l, res_r\), 分别表示 \([l, mid], [mid + 1, r]\) 的值,移动 \(r\), 改变 \(l\) 最后统计答案。

  9. https://www.luogu.com.cn/problem/P11860
    这个题由于点只有一个中转的作用,可以把边看成点,两个"点"之间的权值就是原本这两条边的权值之差,前提是两边有交点,然后可以将边权排序处理,加个超级源点和汇点,就可以跑最短路了。

  10. https://www.luogu.com.cn/problem/CF1305G
    这个题的特点是:一个点的贡献是 \(out_i \times a_i\), \(out\) 为出度。对于这样的贡献,可以把 \((i,j)\) 边权(无向边)转化为 \(a_i+a_j\), 答案为最大生成树权值减去 \(\sum a_i\), 这是因为入度为 \(1\),所以看成无向图后贡献为 \(\sum (d_i-1) \times a_i\), 推广一下:如果题目贡献和点的度数有关,可以把每条边都加上要贡献的东西,最后减一下不该加的。

  11. 求自然数幂和一般用插值或者伯努利数解决,但是我不会(,下面是一种另外的递推求解方式:

\(\large{S_k(n)=\sum\limits_{i=0}^n i^k}\)

扰动一下,得

\[\large{S_k(n)+(n+1)^k=\sum\limits_{i=0}^{n+1}i^k} \]

\[\large{=\sum\limits_{i=1}^{n+1}i^k} \]

\[\large{=\sum\limits_{i=0}^{n}(i+1)^k} \]

\[\large{=\sum\limits_{i=0}^{n}\sum\limits_{j=0}^k \binom{k}{j}i^j} \]

\[\large{=\sum\limits_{j=0}^k \binom{k}{j}\sum\limits_{i=0}^{n}i^j} \]

\[\large{=\sum\limits_{j=0}^k \binom{k}{j}S_j(n)} \]

\[\large{=S_k(n)+kS_{k-1}(n)+\sum\limits_{j=0}^{k-2}\binom{k}{j}S_j(n)} \]

\[\large{S_{k-1}(n)=\dfrac{1}{k}((n+1)^k-\sum\limits_{j=0}^{k-2}\binom{k}{j}S_j(n)}) \]

整理得:

\[\large{S_{k}(n)=\dfrac{1}{k+1}\left((n+1)^{k+1}-\sum\limits_{j=0}^{k-1}\binom{k+1}{j}S_j(n)\right)} \]

递推时间复杂度 \(O(n^2)\), 也侧面证明了 \(S_k(n)\) 是一个关于 \(n\)\(k+1\) 次多项式

  1. 插入直线的李超树是 \(\mathcal{O}(\log n)\) 的,链的并查集是均摊 \(\mathcal{O}(1)\) 的。

  2. dp 如果某一维过大但是值域很小,可以尝试交换值域和这一维状态。

  3. 基于值域的 01 背包可行性(\(n\)\([1, V]\) 的数 \(a_1, a_2, \cdots, a_n\) 凑出 \(S\))做法:正常需要 \(\mathcal{O}(nS) = \mathcal{O}(n^2V)\), bitset 可以除一个 \(\omega\), 然而下面的方法可以做到 \(\mathcal{O}(nV)\).
    首先找到最大的 \(pos\) 使得 \(\sum\limits_{i=1}^{pos} a_i \le S\) 如果 \(pos = n\) 直接判断是否取等,否则将序列分为 \(i < pos\)\(i > pos\) 两部分。最终的解一定是从前面丢掉一些后面加上一些。

\(sum\) 为当前选取的数的和,初始为 \(\sum\limits_{i=1}^{pos} a_i\), 一次操作如果 \(sum \le S\) 就加入后面的数,否则删掉前面的数,这样会使 \(sum\) 始终在 \((S - V, S + V]\) 中,并且如果有解肯定能构造,并且不会出现丢完/选完的情况(感性理解即可)。

然后从 \(pos\) 开始操作,\(f_{l, r, w}\) 表示前面考虑到了 \(r\) 后面考虑到了 \(l\),能否构造出 \(w\), \(w\)\(\mathcal{O}(V)\) 的,初始状态为 \(f_{pos + 1, pos, sum} = 1\),转移只要枚举上一步的操作即可。时间复杂度 \(\mathcal{O}(n^2V)\)

考虑优化,设 \(g_{r, w}\) 表示最大的 \(l\) 使得 \(f_{l, r, w} = 1\)(显然 \(f_{x, r, w}\) 关于 \(x\) 不增),如果没有记为 \(0\), 转移同理,具体如下:

\[g_{r, w} \leftarrow g_{r-1, w} \]

\[g_{r, w + a_r} \leftarrow g_{r-1, w}(w \le S) \]

\[g_{r, w - a_l} \leftarrow l(w > S \land l < g_{r, w}) \]

发现第三个转移是瓶颈。注意到 \(g_{x, w}\) 关于 \(x\) 不减,所以当 \(l < g_{r - 1, w}\) 时已经在 \(r - 1\) 时被转移过了(\(g_{r - 1, w - a_l} \leftarrow l, g_{r, w-a_l} \leftarrow g_{r-1, w-a_l}\) ),只要转移 \(l \ge g_{r - 1, w}\) 即可,时间复杂度 \(\mathcal{O}(V\sum g_{r, w} - g_{r - 1, w}) = \mathcal{O}(nV)\)

  1. dijkstra 的复杂度严格上来说不是 \(\mathcal{O}(|E| \log |V|)\) 的,因为这里 \(|E|\) 指的是松弛次数,不是边数,有时候可以优化,详见 https://www.luogu.com.cn/article/cq91ow5i

  2. From 冷却心:取模题 ull 一般快于 ll, 不减成负数适合用。

  3. 乘法优秀取模方法:ll mod2 = mod * mod 之后的乘法如果 >= mod2 减 mod2,最后再 % mod

  4. 标记永久化:如果一个标记很难 pushdown 就永久化了,比如这题,http://111.229.45.229:8081/p/P1045 ,单调队列维护标记,查询的话在把左右儿子的合并之后和自己的标记合并即可。

  5. deque 开 1e6 个会 MLE 怎么办??????vector 又被卡常了咋办?????只需要开一个 basic_queue 数组,里面有足够的空间,然后每个需要的 queue 就以指针的形式开起来,只要保证使用的 basic_queue 的区间不交即可。

  6. 区间 \([l, r]\) 存在 \(n\) 的倍数的充要条件是 \(\lfloor \dfrac{n}{l-1} \rfloor < \lfloor \dfrac{n}{r} \rfloor\)

  7. 高斯消元卡常小技巧:使用指针存数组,这样 swap 两个数组就是 \(\mathcal{O}(1)\) 的,常数--

  8. Trie 树小技巧:将字符串末尾加入一个特殊字符再插入能使得所有字符串都对应一个叶子节点。、

  9. Trie 树小技巧:将只有一个子节点的点缩掉后,高度要从 \(i \rightarrow i + 1\) 需要插入一个长度至少为 \(i + 1\) 的串,所以树高是 \(\mathcal{O}(\sqrt L)\) 级别的,\(L\) 为字符串总长度。

  10. 长度为 \(n\) 的字符串本质不同的回文子串只有 \(\mathcal{O}(n)\) 个。
    证明: 每在字符串末尾添加一个字符,本质不同回文串数量最多增加 \(1\)
    考虑反证,设字符串在添加 \(s_n\) 后,\(s_{x...n}\)\(s_{y...n}\)(令 \(x < y\))都是 之前没有出现过 的回文串,那么根据回文串的定义,可得 \(s_x = s_n = s_y = s_{x+n-y}\)\(s_{x+1} = s_{n-1} = s_{y+1} = s_{x+n-y-1}\),以此类推,我们得到 \(s_{x...x+n-y}\)\(s_{y...n}\) 完全相同,矛盾。因此引理得证。

  11. \(n\) 个节点带标号有根树上拓扑序个数为 \(\dfrac{n!}{\prod sz_u}\)。因为每个点 \(u\) 在子树内合法的情况只有 \(\dfrac{1}{sz_u}\) 种。

  12. 如果树上有一些关键点,这些点的最小连通子图的边权和可以通过以下方式求出:按 dfn 排序后相邻点之间的距离之和(第一个点和最后一个点相邻)的 \(\dfrac{1}{2}\)。证明:按 dfs 走,每条边都会贡献两次,这样算刚好算到所有有贡献的边。

  13. https://www.luogu.com.cn/problem/P2824 假设答案为 \(x\),将 \(\ge x\) 的数值变为 \(1\)\(< x\) 的变为 \(0\),则一个必要条件是最后 \(p\) 上的数字为 \(1\),线段树维护区间 \(1\) 的个数可以直接做 \(01\) 序列排序。容易发现这东西有单调性,于是可以二分答案,时间复杂度 \(\mathcal{O}(n \log^2 n)\)

  14. https://www.cnblogs.com/Loop1st/p/19363909 神秘线性做法。

  15. noip2025 t4: 见我的题解,使用了线性分治。

  16. 条状/梯形查询: 拆成若干三角形/矩形。noip2025 t4 也有这种做法。

  17. 当方程为 \(ax + by = \gcd(a, b)\) 时exgcd 求出的 \(x, y\) 满足 \(|x| + |y|\) 最小,但是注意如果方程是 \(ax + by = c\),就不一定满足了!!!!!!!!

  • 1 ~ n 异或和:
int calc(int n) {
    int t = n % 4;
    if (!t) return n;
    if (t == 1) return 1;
    if (t == 2) return n + 1;
    if (t == 3) return 0;
}

归纳可证。

  1. \(n\) 条边 \(a_1, a_2, \dots, a_n\) 能围成 \(n\) 边形,当且仅当 \(2\max a_i \le \sum a_i\),证明考虑两点直接线段最短。

  2. \(x = \sum\limits_{0 \le i < x} 1 = \sum\limits_{1 \le i \le x} 1\),在计数题中很有用,在直接计数很麻烦时可以考虑,比如纯蓝,比如 abc386g。

  3. 矩阵可交换条件:

    1. \(AI = IA\)
    2. \(AA^{-1} = A^{-1}A\)
    3. \(A^kA^l=A^lA^k\)
    4. \(AF(A)=F(A)A\),其中 \(F(A)\) 是关于 \(A\) 的多项式。
  4. https://www.cnblogs.com/Loop1st/p/19417760 把同余通过扩域改成绝对值,得出下界后证明一定可以取到。

  5. https://www.luogu.com.cn/problem/P10052 可能会重复转移,那么可以 dijkstra,也可以直接循环两遍。

  6. https://www.luogu.com.cn/problem/P10052 遇到和实数有关的问题尽量转化为整数。

  7. https://www.luogu.com.cn/problem/P3320 有个结论:给定树上若干关键点,使这些点联通需要选的边权之和最小为关键点按 dfn 排序后相邻距离之和(\(k\)\(1\) 相邻)的 \(\frac{1}{2}\),即 \(dis(a_1, a_2) + dis(a_2, a_3) + \cdots + dis(a_{k - 1}, a_k) + dis(a_k, a_1)\)。证明就画个图感性理解。

  8. https://www.luogu.com.cn/problem/P2336 类似上一个结论,我们找若干个点覆盖其到根的路径,注意是覆盖,这就是相当于先全部路径 \(+1\),然后 dfn 排序后两两 lca 的路径 \(-1\),但是这里就不需要减 \(\text{lca}(a_1, a_k)\) 到根的路径了。

  9. 有后效性的东西可以考虑换元来转化成无后效性的,比如树上问题 \(f_u = \sum\limits_{v\in son_u} a_v + C\sum\limits_{v \in anc_u}a_v\)\(C\) 为常数,就可以利用树上差分,记 \(c_u=\sum\limits_{v \in anc_u}a_v\) 进行转化。 https://www.luogu.com.cn/problem/P11189

  10. https://www.cnblogs.com/Loop1st/p/19468340 如果一个 DP 数组对于某一维,值域被分成了 \(\mathcal{O}(1)\) 个连续段,那么可以考虑维护分界点的更新。

  11. https://www.luogu.com.cn/problem/P14963 显然转化为动态消消乐,询问 \(s, t\) 消下去能不能相同。那么这时候考虑用某个运算来维护消消乐时候的栈,那么要求 \(a * a = e\)\(e\) 为单位元,且不满足交换律,这样 baab 就可以消空,abab 就不能消空。然后还要有结合律方便 DS 维护,于是对于每个元素随机两个权值 \(a, b\),然后对

\[\begin{pmatrix} a & \frac{1-a^2}{b} \\ b & -a \end{pmatrix}\]

做矩阵乘法,用线段树维护就对了。

待填坑:

posted @ 2025-02-09 15:34  循环一号  阅读(82)  评论(0)    收藏  举报