AtCoder Beginner Contest 212

E

考虑记 $f_{i, u}$ 表示走 $i$ 步到 $u$ 的方案数显然有转移式

$$f_{i, u} = \sum _ {(u, v) \in Edge} f_{i - 1, v} $$

状态数为 $nk$转移的时间复杂度为 $\Theta(n)$于是总时间复杂度为 $\Theta(n ^ 2 k).$

考虑到删除的边数很少于是将转移方程改写为

$$f_{i, u} = \sum _ {v = 1} ^ n f_{i - 1, v} - \sum _ {(u, v) \not\in Edge} f_{i - 1, v} $$

前一项可以算完每个 $i$ 以后记录一下后一项合法转移数量之和为 $m$于是总时间复杂度被优化至 $\Theta(nk + mk).$

F

看到这个题我们首先想到的肯定是倍增

但是细想一下可以发现从一个点 $i$ 开始跳 $2 ^ j$ 步到的地方还与时间有关是难以处理的

我们考虑记 $f_{i, j}$ 表示从 $i$路径开始$2 ^ j$ 步到的地方容易发现此时 $f_{i, j}$ 的值是唯一的

于是用 $\rm set$ 维护出 $y$ 号点在 $x$ 时刻开始要走上的路径然后不断往后跳直到停在最后一个时间不大于 $z$ 的位置判断一下是停在路上还是停在点上即可

时间复杂度 $\Theta(n \log n + q \log n).$

G

首先考虑到当 $x = 0$ 时有且仅有 $y = 0$ 满足条件于是我们不妨设 $1 \leqslant x, y < P$最后再给答案加上 $1$

考虑 $P$ 的一个原根 $r$$x = r ^ a, y = r ^ b$容易发现 $(x, y)$$(a, b)$ 一一对应于是有

$$x ^ n \equiv y \iff r ^ {an} \equiv r ^ b \pmod P $$

考虑拓展欧拉定理可以发现

$$r ^ {an} \equiv r ^ b \pmod P \iff an \equiv b \pmod {P - 1} $$

于是问题被转化为求满足 $an \equiv b \pmod {P - 1}$$(a, b)$ 数量

根据裴蜀定理可以推导出

$$\sum _ {a = 1} ^ {P - 1} \sum _ {b = 1} ^ {P - 1} [an \equiv b \pmod {P - 1}] = \sum _ {a = 1} ^ {P - 1} \frac{P - 1}{(P - 1, a)} $$

考虑对 $(P - 1, a)$ 相等的 $a$ 一起计算$f(g)$ 表示满足 $g = (P - 1, a)$$a$ 的数量可以发现 $g~|~P - 1$$f(g) = \varphi\left(\frac{P - 1}{g}\right)$

考虑求解 $\varphi(n)$观察到 $\varphi \times I = id$于是有

$$\varphi(n) = n - \sum _ {d | n \& d \not= n} \varphi(d) $$

进一步有

$$f(g) = \frac{P - 1}{g} - \sum _ {g|k \& g \not=k} f(g) $$

从大到小枚举 $g$枚举其倍数转移一下即可时间复杂度 $\Theta(\sqrt{P} + d ^ 2(P - 1))$

H

考虑记 $w + 1$ 为第一个大于所有 $a_i$$2$ 的幂$S$$a$ 序列中数构成的集合

造一个集合幂级数 $F(x) = \sum _ {i = 0} ^ w [i \in S]x ^ i$容易发现答案即为

$$\sum _ {i = 1} ^ n \left(k ^ i - [x ^ 0] F^i(x) \right) $$

利用 $\rm FWT$ 的线性性推一推式子

$$\begin{aligned} &~~~~~\sum _ {i = 1} ^ n \left(k ^ i - [x ^ 0] F^i(x) \right) \\ &=\sum _ {i = 1} ^ n \left( k ^ i - [x ^ 0] \textrm{IFWT}(\textrm{FWT}\cdot F^i (x)) \right) \\ &=\sum _ {i = 1} ^ n k ^ i - [x ^ 0] \textrm{IFWT}\left( \sum _ {i = 1} ^ n \textrm{FWT} \cdot F^i(x)\right) \end{aligned} $$

$\rm FWT$$F$ 的幂表示对每一项系数做点乘

$G(x) = \textrm{FWT} \cdot F(x)$用一下等比数列求和公式则有答案为

$$\sum _ {i = 1} ^ n k ^ i - [x ^ 0] \textrm{IFWT}\left[ \sum _ {i = 0} ^ w \left( \frac{g_i ^ {n + 1} - g_i}{g_i - 1} \right)x ^ i \right] $$

计算上式所需时间复杂度为 $\Theta((n + w) \log (n + w)).$

Code Link