MATH Day 04 Applications & Practice II
第二档习题集 (Selected Problem Set)
E1. CF1744E2
你的手稿:
给定 \(a, b, c, d\)。找一对 \((x, y)\) 满足 \(a < x \le c, b < y \le d\),且 \(ab \mid xy\)。
先考虑 E1 的简单情况,即 \(10^5\) 内,枚举 \(x \Rightarrow ab \mid xy \Rightarrow \frac{ab}{\gcd(ab, x)} \mid y \Rightarrow\) 检查 \(\lfloor \frac{b}{L} \rfloor < \lfloor \frac{d}{L} \rfloor \Rightarrow\) 有解,否则看端点 \(\Rightarrow\) 无解。
再考虑 E2 的困难情况,将 \(a, b\) 分解质因数,暴力枚举因子。由于因子个数为 \(\sqrt{n}\) 量级,因此复杂度正确。(实际上,\(d(n)\) 的增长为 \(O(n^\epsilon)\) 量级)。
🧑🏫 讲师补充:
- 因子构造法: 在 E2 中,令 \(L = ab\)。我们寻找 \(L\) 的所有约数 \(d_1\)。如果存在 \(d_1\),使得它可以拆分为 \(d_1 \cdot d_2 = L\),且存在倍数 \(k_1, k_2\) 满足 \(a < k_1 d_1 \le c\) 且 \(b < k_2 d_2 \le d\),则找到解。
- 搜索空间优化: 对于 \(10^9\) 范围内的数,其约数个数 \(d(n)\) 其实并不大(例如 \(10^9\) 以内约数最多的数是 \(735134400\),仅有 \(1344\) 个约数)。通过对 \(a\) 和 \(b\) 分别分解并合并质因数,构造出 \(ab\) 的所有因子在 \(O(d(ab))\) 时间内完成,完全可以承受。
- 边界检查: 检查是否存在 \(k \cdot d_1 \in (a, c]\) 的快捷方法是:判断 \((\lfloor a / d_1 \rfloor + 1) \cdot d_1 \le c\)。
E2. CF1646E
你的手稿:
给定 \(n \times m\) 表格,\(i\) 行 \(j\) 列数为 \(i^j\),求表中不同值的个数。
考虑“根数”:质因子指数 \(\gcd=1\) 的数。大力维护 \(1 \sim n, 2 \times 1 \sim n, \dots, L \times 1 \sim n\) 的并集量。
对每个原数族大力统计即可。
🧑🏫 讲师补充:
- 行退化性质: 问题的本质在于某些行(如 \(2^j\) 和 \(4^j\))会有重叠。如果一个数 \(b\) 不是任何数的幂(即你提到的“根数”),那么以 \(b, b^2, b^3, \dots, b^k\) 为底的行都会产生重复。
- 去重转化: 对于每一个根数 \(b \le n\),计算它在表内贡献的行数 \(k = \lfloor \log_b n \rfloor\)。问题转化为求集合 \(\{x \cdot y \mid 1 \le x \le k, 1 \le y \le m\}\) 的大小。
- 预处理: 由于 \(k \le \log_2(10^6) \approx 20\),我们可以预处理出 \(f(k)\),表示前 \(k\) 行合并后的去重个数。使用
std::bitset或简单的暴力标记即可快速得到 \(f(k)\)。
E3. 原根构造
你的手稿:
原根构造:如何高效地找一个数 \(p\) 的原根。
① 验证:分解质因数 \(p-1 \Rightarrow \prod p_i^{e_i}\)。逐个计算 \(g^{\frac{p-1}{p_i}} \stackrel{?}{\equiv} 1 \pmod p\)。复杂度 \(O(\omega(p-1) \log p)\)。
② 选择:随机化/从小到大选。共 \(\phi(p-1)\) 个原根,概率为 \(\frac{\phi(p-1)}{p-1}\)。大概期望试 \(O(\log \log p)\) 次。
复杂度量级:\(O(\sqrt{p} + \text{poly} \log(p))\)。
🧑🏫 讲师补充:
- 存在性补充: 注意原根存在的充要条件:\(n = 2, 4, p^k, 2p^k\)(其中 \(p\) 为奇素数)。
- 搜索效率: 在大数环境下,最小原根通常非常小。根据 Wang's Theorem,在广义黎曼猜想(GRH)假设下,最小原根 \(g < 2(\log p)^2\)。这解释了为什么“从小到大选”在实践中极快。
- 判定逻辑: 你的判定条件非常精准:\(g\) 是原根当且仅当对于 \(p-1\) 的所有质因子 \(q\),都有 \(g^{(p-1)/q} \not\equiv 1 \pmod p\)。
E4. CF906D (幂塔)
你的手稿:
给定序列 \(a_1, \dots, a_n\),模数 \(m\)。\(Q\) 次查询。
每次询问 \(a_l^{a_{l+1}^{\dots^{a_r}}} \pmod m\)。此处考虑 Euler 降幂:
\(x^n \pmod m = \begin{cases} a^b & (b < \log_2 m) \\ a^{b \pmod{\phi(m)} + \phi(m)} & (b \ge \log_2 m) \end{cases}\)
利用巧妙的代数不等式 \(\phi(n) \ge \log_2 n\) (\(n=6\) 单验。
\(x^n \pmod m = \begin{cases} a^b & (b < \phi(m)) \text{(主流判断)} \\ a^{b \pmod{\phi(m)} + \phi(m)} & (b \ge \phi(m)) \end{cases}\)
定义 safe-mod 运算:\(a < m\) 时 \(\Rightarrow a\),否则 \(\Rightarrow a \% m + m\)。
此时 \(x^n \pmod m = x^{\text{safe\_mod}(n, \phi(m))} \pmod m\)。无限递归直到 \(m=1\) 为止 \(\Rightarrow\) 返回 0。
法二:不依赖巧妙的 safe-mod 构造,暴力估值比较 \(b\) 和 \(\log_2 m\)。
引理:若一连串幂塔皆非 1 \(\Rightarrow\) 在 4 步内必数值爆炸(不可能是任何对数)。
否则必可暴算(有 1,3 步以内按层计算)。
复杂度仍为单次 \(O(\log^2 m)\),但需维护 1 的位置列,实现较复杂。
🧑🏫 讲师补充:
- 收敛性: 扩展欧拉定理之所以有效,是因为 \(\phi(m) < m\),且对于 \(m > 1\),迭代 \(\phi\) 函数会在 \(O(\log m)\) 次内到达 1。这保证了递归深度。
- Safe-mod 的优雅性: 你的
safe-mod实现(也称作“扩展欧拉定理的统一形式”)是竞赛中最推荐的写法,它避免了显式的分段讨论。 - 计算细节: 在实现 \(a^b\) 的快速幂时,内部的乘法也必须使用
safe-mod,以确保每一层都能正确传递“是否大于等于模数”的状态。
E6. CF1854B
你的手稿:
\(n\) 张牌,有值 \(a_i\),初始解锁 1。每次选一个已解锁的 \(i\):
- 解锁后续 \(a_i\) 张(若有)
- 或获得 \(a_i\) 分,卡牌报销。
求最大得分。
非常巧妙的一个想法:不统计分数,只看每个前缀能否恰好被解锁。
当前处理到 \(a_i\),若 \(\exists j \ge i\),前 \(j\) 位已解锁 \(\Rightarrow j+a_i\) 位也恰好被解锁。
则 \(\forall j \ge i \Rightarrow dp_{j+a_i} = dp_j\),最后统计 \(dp_i\) 取最大分数。
严正提示:可能出现不足够的 \(n\),但在 \(n\) 到 \(2n\) 之间产生的“余项”情况下,找到第一个 \(>n\) 的恰好位,则可能漏解。
🧑🏫 讲师补充:
- 状态转移方程: 设
dp为位集(bitset),第 \(i\) 位为 1 表示“可以恰好解锁前 \(i\) 张牌”。对于第 \(i\) 张牌,更新:dp |= (dp & ~( (1 << i) - 1 )) << a[i]。 - 分数的转化: 最终得分 = (总和) - (总共解锁的牌数 - 1)。因此我们要找所有满足 \(dp_i = 1\) 的 \(i\),计算 \(\sum_{k=1}^{\min(i, n)} a_k - (i-1)\) 的最大值。
- 范围注意: 确实如你所说,解锁范围最高可达 \(2n\)。bitset 的长度应开到 \(2 \cdot 10^5\)。
E8. ABC212G
你的手稿:
给定 \(p\),计算 \((x, y)\) 对:
① \(0 \le x, y \le p-1\)
② \(\exists n, x^n \equiv y \pmod p\)。
考虑群 \(\mathbb{Z}_p^*\)(单独讨论 0 的情况)。在循环群内考虑离散对数:\(0 \sim p-2\)。
\(g^i\) 的阶为 \(\frac{p-1}{\gcd(p-1, i)}\),总对数 \(\sum_{i=0}^{p-2} \frac{p-1}{\gcd(p-1, i)} = (p-1) \sum_{i=1}^{p-1} \frac{1}{\gcd(p-1, i)}\)。
枚举 \(\gcd \Rightarrow (p-1) \sum_{d \mid p-1} \frac{1}{d} \cdot \phi(\frac{p-1}{d}) = \sum_{d \mid p-1} d \phi(d)\)。
再利用积性函数性质 + 质因数分解优化求得,技巧性强。
🧑🏫 讲师补充:
- 关于 0 的情况: 别忘了单独处理 \(x=0\)。若 \(x=0\),则 \(x^n\) 为 \(0\) (当 \(n>0\))。所以 \((0,0)\) 是一对满足条件的解。最终结果应为 \(\left(\sum_{d \mid p-1} d \phi(d)\right) + 1\)。
- 公式推导:
- 对于固定的 \(x\),满足 \(x^n \equiv y \pmod p\) 的 \(y\) 的个数,等于 \(x\) 在乘法群 \(\mathbb{Z}_p^*\) 中生成的子群的大小。
- 若 \(x = g^i\),则该子群大小为 \(\text{ord}(g^i) = \frac{p-1}{\gcd(i, p-1)}\)。
- 你的推导 \(\sum_{d \mid p-1} \frac{p-1}{d} \phi(d)\) 非常优雅,利用了 \(\gcd(i, p-1)=d\) 的 \(i\) 有 \(\phi((p-1)/d)\) 个。
- 计算优化: 函数 \(f(n) = \sum_{d \mid n} d \phi(d)\) 是积性函数。若 \(n = \prod p_i^{e_i}\),则 \(f(n) = \prod f(p_i^{e_i})\)。其中 \(f(p^k) = \sum_{j=0}^k p^j \phi(p^j) = 1 + \sum_{j=1}^k p^j (p^j - p^{j-1}) = 1 + \sum_{j=1}^k (p^{2j} - p^{2j-1}) = \frac{p^{2k+1}+1}{p+1}\)。

浙公网安备 33010602011771号