..

UOJ Round #3

A. 核聚变反应强度

20

$n = 1, a_i \le 10^9$

即求 $a_1$ 的次大约数。

众所周知,一个数 $x$ 的约数总是形如 $(d, \frac{x}{d})$ 地成对出现。

从 $1$ 到 $\sqrt a_1$ 枚举 $d$ 得到 $x$ 的所有约数,排序输出次大值。

时间复杂度 $\mathcal O(\sqrt a)$。

60

$n \le 10^4, a_i \le 10^9$

枚举每个 $i$ 依次考虑。

$\text{sgcd}(a_1, a_i)$ 同时是 $a_1, a_i$ 的约数,枚举 $a_1$ 的所有约数,找到是 $a_i$ 约数的次大值。

时间复杂度 $\mathcal O(n \sqrt a)$。

100(骗分)

$\text{sgcd}(a_1, a_i) \lt \gcd(a_1, a_i)$,先求出 $d = \gcd(a_1, a_i)$,只枚举 $a_1$ 约数中小于 $d$ 的即可。

复杂度不靠谱,但是对于 $a_i \le 10^{12}$ 的范围实际运行速度十分优秀,需要构造针对的数据才能卡住。

100

$n \le 10^5, a_i \le 10^{12}$

考虑分解质因子。

\[\begin{aligned} a & = p_1^{x_1} p_2^{x_2} \cdots p_m^{x_m} \\ b & = p_1^{y_1} p_2^{y_2} \cdots p_m^{y_m} \\ \gcd(a, b) & = p_1^{\min(x_1, y_1)} p_2^{\min(x_2, y_2)} \cdots p_m^{\min(x_m, y_m)} \end{aligned}\]

$a, b$ 的公约数一定是 $\gcd(a, b)$ 的约数,将 $\gcd(a, b)$ 除去其最小质因子即可得到 $\text{sgcd}(a, b)$。

对 $a_1$ 使用 $\mathcal O(\sqrt a_1)$ 的时间分解得到 $\mathcal O(\log a_1)$ 个质因数。

对于每个 $a_i$,求出 $d = \gcd(a_1, a_i)$,在 $a_1$ 的质因数种找到最小的 $p$ 使得 $p$ 整除 $d$,$\frac{d}{p}$ 即为所求。

时间复杂度 $\mathcal O(\sqrt a + n \log a)$。

B. 铀仓库

30

$n \le 100, t \le 1000$

小 O 的行动一定是,每次看准一个箱子,从 $s$ 跑过去拿起来,然后直接搬回 $s$,且起始位置 $s$ 一定有箱子。

于是枚举 $s$,每次搬最近的箱子。

时间复杂度 $\mathcal O(n^2 t)$。

80

$n \le 10^5, t \le 10^{18}$

仍然枚举 $s$,搬前若干近的箱子,可以二分最远距离。

若有 $x_i = i$ 可以 $\mathcal O(1)$ 确定左右端点,否则需要再次二分确定左右端点。

时间复杂度 $\mathcal O(n \log n \log x)$。

100

$n \le 5 \times 10^5, t \times 10^{18}$

二分答案,检查即为求叠 $mid$ 个箱子的最短时间。

搬的箱子一定是连续的一段,记其为 $[l, r]$。

从左到右枚举 $s$,$l, r$ 一定单调不降,双指针维护一下。

时间复杂度 $\mathcal O(n \log x)$

C. 链式反应

10

$n \le 8$

暴搜。

40

\[f[i] = \frac{\sum_j \sum_k \binom{i - 1}{j} \cdot \binom{i - 1 - j}{k} \cdot f[j] \cdot f[k]}{2}\]

其中 $i - 1 - j - k \in A$。

时间复杂度 $\mathcal O(n^3)$。