学习笔记(杂)
模非质数意义下的乘法:先将除数与质数的公因子提出来单独考虑,然后剩下部分利用欧拉定理:$a^{\phi(x)} \equiv 1 (\bmod m) (\gcd(a, m) = 1)$,得到 $a^{\phi(x) - 1}$ 即为模 $m$ 意义下 $a$ 的逆元。
Nim - K 游戏:所有堆石子二进制每位相加 $\bmod (K + 1)$ 均为 $0$ 则先手必败,否则先手必胜。
遇到操作形如将相邻的两个 0/1 取反,转化:将奇数位的 0/1 取反,则操作转化为交换相邻两个数。
当满足以下条件时可尝试最小割:
1. 每个点有两个状态:选或不选。
2. 当所有点的状态确定时,该局面的价值也确定。
计算若干个数中满足 $\gcd(a_x, a_y) = 1$ 的数的乘积最大值:从大到小向栈里添加数,每添加一个判断栈内是否存在一个数与其 $\gcd$ 等于 $1$,有则将栈内两数间的所有数弹出并更新答案。判断可以使用容斥计算(莫比乌斯函数)。
MEX 相关 Trick:
进行最优化 DP (例如求最小 MEX)时可以考虑钦定一个值不能选去 DP。
对于一个有点权的图(或树,链等),用链去覆盖所有边,一条链的代价是被覆盖的点权的 MEX,则考虑进行 DP 时利用上一个 Trick 设置一维状态,则该维状态可以只开到 $O(\frac{V}{\ln{V}})$。
交互 Trick :
1. 对于两个不相等的数,其二进制不完全相等,即一定存在一位二进制使得两数该位不相等。
多米诺骨牌的排满方案即二分图完美匹配数量。
二分图完美匹配方案奇偶性等价于矩阵行列式奇偶性。
二分图最大独立集 $=$ 二分图点数 $-$ 二分图最大匹配
证明:记二分图点数为 $n$,最大匹配大小为 $m$,考虑将二分图最大匹配中的点移去,则剩余点之间无连边,即可全选,即点数为 $n - 2m$,设此时的点集为 $S$,此时考虑增加最大匹配中的点,对于一条匹配边 $(x, y)$,有以下几种情况:
- $x, y$ 均与 $S$ 中的点无连边,则可以选择 $x$ 与 $y$ 中的任意一点加入 $S$。
- $x$ 与 $S$ 中的点有连边,$y$ 与 $S$ 中的点无连边,则选择 $y$ 加入 $S$。
- $x$ 与 $S$ 中的点无连边,$y$ 与 $S$ 中的点有连边,则选择 $x$ 加入 $S$。
- $x, y$ 均与 $S$ 中的点有连边,此时存在增广路,不符合最大匹配。
综上所述,最大匹配中每条边都可以选一个点加入 $S$,则最大独立集大小为 $n - m$。
代表元容斥相关 Trick:
1. 二分图完美匹配相关(霍尔定理):计数不存在完美匹配的二分图,记 $N(S)$ 表示左部点集合为 $S$ 时与右部联通的点集,考虑令 $|S| - |N(S)|$ 最大的为代表元,若有多个则取 $|S|$ 最小的,可以证明此时 $S$ 唯一。
线性递推数列相关
设有一个 $k$ 阶线性递推数列 $f_i = \sum\limits_{j = 1}^{k} c_j f_{i - j}$
定义其特征方程为 $x^k = \sum\limits_{j = 1}^{k} c_j x^{k - j}$
设在复数域中该方程的解为 $\lambda_1, \lambda_2, \cdots, \lambda_k$,则 $f_n = \lambda_i^n$ 是该数列的一个特解。
由数学归纳法与特征方程定义易证 $\lambda_1^n, \lambda_2^n, \cdots, \lambda_k^n$ 的任意线性组合与 $f_n$ 的解一一对应。
若给出了 $f_0 \sim f_{k - 1}$ 的值,考虑关于 $k$ 维向量 $\alpha$ 的方程组
$$\begin{cases} \alpha_1 + \alpha_2 + \cdots + \alpha_k = f_0 \\ \alpha_1 \lambda_1 + \alpha_2 \lambda_2 + \cdots + \alpha_k \lambda_k = f_1 \\ \vdots \\ \alpha_1 \lambda_1^{k - 1} + \alpha_2 \lambda_2^{k - 1} + \cdots + \alpha_k \lambda_k^{k - 1} = f_{k - 1} \end{cases}$$
则其系数矩阵为范德蒙德矩阵,其行列式为
$$\begin{vmatrix} 1 & 1 & \cdots & 1 \\ \lambda_1^1 & \lambda_2^1 & \cdots & \lambda_k^1 \\ \vdots & \vdots & \ddots & \vdots \\ \lambda_1^{k - 1} & \lambda_2^{k - 1} & \cdots & \lambda_k^{k - 1} \end{vmatrix}$$
当 $\lambda_1 \sim \lambda_k$ 互不相等时,该行列式值非零,即上述方程组有唯一解,即递推数列通项公式为 $f_n = \sum\limits_{i = 1}^k \alpha_i \lambda_i^n$。
斐波那契循环节
斐波那契序列递推式:$f_i = \begin{cases}i & i < 2 \\ f_{i - 1} + f_{i - 2} & i \ge 2 \end{cases}$
对于任意模数 $m$,考虑求出最小的 $t$ 满足 $f_t \equiv f_0 \pmod m$ 且 $f_{t + 1} \equiv f_1 \pmod m$
记 $\phi$ 与 $\hat{\phi}$ 为斐波那契数列的特征方程 $x^2 - x - 1 = 0$ 的两根,即 $\phi = \frac{1 + \sqrt{5}}{2}, \hat{\phi} = \frac{1 - \sqrt{5}}{2}$,有 $f_n = \dfrac{\phi^n - \hat{\phi}^n}{\sqrt{5}}$
首先考虑将 $m$ 拆分成 $\prod\limits_i p_i^{k_i}$,对每个 $p^k$ 求解后 CRT 合并。
现在考虑对于 $m = p^k$ 求解
引理 1:$a \equiv 1 \pmod p \Rightarrow a^{p^k} \equiv 1 \pmod {p^{k + 1}}$
证明:考虑数学归纳法,设已知 $a^{p^{k - 1}} \equiv 1 \pmod {p^k}$。
则 $a^{p^{k - 1}} = t p^k + 1$。
则 $a^{p^k} = (a^{p^{k - 1}})^p = (t p^k + 1)^p = 1 + \sum\limits_{i = 1}^p {\dbinom{p}{i} (t p^k)^i} \equiv 1 \pmod {p^{k + 1}}$
设 $m = p^k$ 时循环节为 $T$,$m = p$ 时循环节为 $t$。
则满足 $f_t = \dfrac{\phi^t - \hat{\phi}^t}{\sqrt{5}} \equiv 0 \pmod p$,则 $\phi^t \equiv \hat{\phi}^t \pmod p$
又有 $f_{t + 1} = \dfrac{\phi^{t + 1} - \hat{\phi}^{t + 1}}{\sqrt{5}} \equiv \phi^t \times \dfrac{\phi - \hat{\phi}}{\sqrt{5}} = \phi^t f_1 \equiv 1 \pmod p$,即 $\phi^t \equiv 1 \pmod p$。
由引理 1 得 $\phi^{t p^{k - 1}} \equiv \hat{\phi}^{t p^{k - 1}} \equiv 1 \pmod {p^k}$,所以只需考虑 $m = p$ 时的情况。
首先有 $t = \begin{cases}2 & p = 2 \\ 8 & p = 3 \\ 20 & p = 5 & \end{cases}$
剩余 $p > 5$ 的情况分两类:
- $5$ 是模 $p$ 意义下的二次剩余,此时可以使用费马小定理,$\phi^{p - 1} \equiv 1 \pmod p$,则显然有 $t | (p - 1)$。
- $5$ 是模 $p$ 意义下的二次非剩余,则有 $5^{\frac{p - 1}{2}} \equiv -1 \pmod p$,此时考虑 $\phi^p \equiv \dfrac{1}{2} (1 + \sqrt{5})^p \equiv \dfrac{1}{2} (1 + \sqrt{5}^p) \equiv \dfrac{1}{2} (1 + 5^{\frac{p - 1}{2}} \sqrt{5}) \equiv \dfrac{1 - \sqrt{5}}{2} = \hat{\phi} \pmod p$,由 $\phi \hat{\phi} = -1$ 得 $\phi^{p + 1} \equiv -1 \pmod p$ 即 $\phi^{2p + 2} \equiv 1 \pmod p$,此时有 $t | (2p + 2)$。
则对于 $m = p^k$ 时 $t$ 的取值在 $O(m)$ 级别,而 CRT 合并后的 $t$ 为原所有 $t$ 的 $\operatorname{lcm}$,所以仍然是 $O(m)$ 级别。具体地,$t \le 6m$(暂时不会证,留坑),可以 $O(m)$ 求解。
例题
记斐波那契数列为 $f$。
则有 $F_i = a f_{i - 1} + b f_i$,要求即为最小的 $t$ 满足 $a f_{t - 1} + b f_t \equiv 0 \pmod m$。
这个式子不太优美,考虑令 $b \leftarrow (m - b) \bmod m$,则上式为 $a f_{t - 1} \equiv b f_t \pmod m$。
令 $a, b, m$ 同除以 $\gcd(a, b, m)$,记 $a' = \dfrac{a}{\gcd(a, b, m)}, b' = \dfrac{b}{\gcd(a, b, m)}, m' = \dfrac{m}{\gcd(a, b, m)}$
则有 $a' f_{t - 1} \equiv b' f_t \pmod {m'}$。
引理 2:$a \mid m \Rightarrow \forall a \mid (x \bmod m), a \mid x$
证明显然。
考虑有
$\begin{cases} \gcd(a', m') \mid (a' f_{t - 1} \bmod m') \\ \gcd(f_{t - 1}, m') \mid (a' f_{t - 1} \bmod m') \\ \gcd(b', m') \mid (b' f_t \bmod m') \\ \gcd(f_t, m') \mid (b' f_t \bmod m') \end{cases}$
由 $a' f_{t - 1} \equiv b' f_t \pmod {m'}$ 得
$\begin{cases} \gcd(a', m') \mid (b' f_t \bmod m') \\ \gcd(f_{t - 1}, m') \mid (b' f_t \bmod m') \\ \gcd(b', m') \mid (a' f_{t - 1} \bmod m') \\ \gcd(f_t, m') \mid (a' f_{t - 1} \bmod m') \end{cases} \Longrightarrow \begin{cases} \gcd(a', m') \mid b' f_t \\ \gcd(f_{t - 1}, m') \mid b' f_t \\ \gcd(b', m') \mid a' f_{t - 1} \\ \gcd(f_t, m') \mid a' f_{t - 1} \end{cases}$
有 $\gcd(a', b', m') = 1, \gcd(f_t, f_{t - 1}) = 1$,所以
$\begin{cases} \gcd(a', m') \mid f_t \\ \gcd(f_{t - 1}, m') \mid b' \\ \gcd(b', m') \mid f_{t - 1} \\ \gcd(f_t, m') \mid a' \end{cases}$
提取其中两式得
$\begin{cases} \gcd(a', m') \mid f_t \\ \gcd(f_t, m') \mid a' \end{cases} \Longrightarrow \begin{cases} \gcd(a', m') \mid \gcd(f_t, m') \\ \gcd(f_t, m') \mid \gcd(a', m') \end{cases} \Longrightarrow \gcd(a', m') = \gcd(f_t, m')$
同理可得 $\gcd(b', m') = \gcd(f_{t - 1}, m')$
则有 $a' f_{t - 1} \equiv b' f_t \pmod {m'} \Longrightarrow \frac{a' f_{t - 1}}{\gcd(a', m') \gcd(f_{t - 1}, m')} \equiv \frac{b' f_t}{\gcd(b', m') \gcd(f_t, m')} \pmod {\frac{m'}{\gcd(a', m') \gcd(b', m')}}$
且有
$\frac{a' f_{t - 1}}{\gcd(a', m') \gcd(f_{t - 1}, m')} \equiv \frac{b' f_t}{\gcd(b', m') \gcd(f_t, m')} \pmod {\frac{m'}{\gcd(a', m') \gcd(b', m')}} \Longleftrightarrow \frac{a' f_{t - 1}}{\gcd(a', m') \gcd(f_{t - 1}, m')} \equiv \frac{b' f_t}{\gcd(b', m') \gcd(f_t, m')} \pmod {\frac{m'}{\gcd(f_{t - 1}, m') \gcd(f_t, m')}}$
则
$\frac{a' \gcd(b', m')}{\gcd(a', m') b'} \equiv \frac{\gcd(f_{t - 1}, m') f_t}{f_{t - 1} \gcd(f_t, m')} \pmod {\frac{m'}{\gcd(a', m') \gcd(b', m')}} \Longleftrightarrow \frac{a' \gcd(b', m')}{\gcd(a', m') b'} \equiv \frac{\gcd(f_{t - 1}, m') f_t}{f_{t - 1} \gcd(f_t, m')} \pmod {\frac{m'}{\gcd(f_{t - 1}, m') \gcd(f_t, m')}}$
等式两边仅分别和 $a', b', m'$ 与 $f_{t - 1}, f_t, m'$ 有关,则将信息记为三元组 $(\gcd(f_t, m'), \gcd(f_{t - 1}, m'), \frac{\gcd(f_{t - 1}, m') f_t}{f_{t - 1} \gcd(f_t, m')} \bmod m')$,对每个 $m'$ 用 `std :: map` 存下每个出现的三元组的 $t$ 的最小值。
查询时在$a', b'$ 对应的 $m'$ 处的 `map` 里查 $(\gcd(a', m'), \gcd(b', m'), \frac{a' \gcd(b', m')}{\gcd(a', m') b'} \bmod m')$ 存储的值即可。
由于 $m'$ 显然仅会是 $m$ 的因子,所以总时间复杂度为 $O(\sigma(m) \log{n})$($sigma(n) = \sum\limits_{d \mid n} d$),即 $O(m \log{\log{m}} \log{n})$。
咕咕咕

浙公网安备 33010602011771号