MATH Day 06 Applications & Practice
第一档习题集选讲
N5.(单射判定)
\(\phi: \mathbb{Z}_6 \to \mathbb{Z}_{12}\) 定义为 \(\phi(\bar{a}) = \overline{2a}\).
a. 验证 \(\phi\) 是群同态.
\(\phi(\bar{a} + \bar{b}) = \overline{2(a+b)} = \overline{2a} + \overline{2b} = \phi(\bar{a}) + \phi(\bar{b})\)
b. \(\text{Ker } \phi = \{ \bar{a} \in \mathbb{Z}_6 : \overline{2a} = \bar{0} \text{ 即 } 2a \equiv 0 \pmod{12} \} = \{ \bar{0} \}\)
c. \(\text{Im } \phi = \{ \bar{0}, \bar{2}, \bar{4}, \dots, \overline{10} \} \leq \mathbb{Z}_{12}\) (\(\phi\) 是单射)
[讲师补充]
- 良定义性检查:在处理模剩余类环的映射时,应首先确认其良定义性。若 \(a \equiv b \pmod 6\),则 \(b = a + 6k\),故 \(2b = 2a + 12k \equiv 2a \pmod{12}\),映射合法。
- 群同态基本定理:由第一同构定理可知 \(\mathbb{Z}_6 / \text{Ker } \phi \cong \text{Im } \phi\)。由于 \(|\text{Ker } \phi|=1\),故 \(\mathbb{Z}_6 \cong \text{Im } \phi\),这从群阶的角度再次验证了单射性。
N6.(循环群同构)
证明:\(\mathbb{Z}_4 \not\cong \mathbb{Z}_2 \times \mathbb{Z}_2\).
\(\mathbb{Z}_4\) 中,\(\bar{1}\) 的阶为 4. 而 \(\mathbb{Z}_2 \times \mathbb{Z}_2\) 中所有元素 \(g^2 = e\),不存在 4 阶元.
[讲师补充]
- 结构分析:\(\mathbb{Z}_4\) 是循环群,而 \(\mathbb{Z}_2 \times \mathbb{Z}_2\) 是著名的克莱因四元群 (Klein four-group, \(V_4\))。
- 推广结论:一般地,\(\mathbb{Z}_{mn} \cong \mathbb{Z}_m \times \mathbb{Z}_n\) 当且仅当 \(\gcd(m, n) = 1\)。此处 \(\gcd(2, 2) = 2 \neq 1\),故不同构。
N7. 维护区间 \([1, 10^9]\),初始全为 1:
① 将 \([l, r]\) 置为 0.
② 将 \([l, r]\) 置为 1.
动态开点线段树板题. 区间赋值 + 查询.
[讲师补充]
- 空间开销:由于值域高达 \(10^9\),动态开点每操作一次大约增加 \(\log(10^9) \approx 30\) 个节点。\(M\) 次操作总空间复杂度约为 \(O(M \log V)\),需注意内存限制。
- 懒标记细节:区间赋值操作需要处理
tag为 0 的情况。建议初始化标记为-1,用0/1表示不同的赋值状态。
N8. 给定一个 \(n\) 点有根树,每个点有 \(a_i\),对于节点 \(u\),求其子树中有多少点值 \(> a_u\).
代码多样,线段树合并、主席树、整体二分、遍历 + BIT.
[讲师补充]
- 线段树合并做法:对每个节点建权值线段树。在 DFS 回溯时,将子节点的线段树合并到父节点,合并过程中即可统计答案。
- 离线做法(遍历 + BIT):利用 DFS 序将子树转化为区间。进入节点 \(u\) 时记录 BIT 中 \(> a_u\) 的数量 \(cnt_1\),遍历完子树后再记录一次 \(cnt_2\),差值 \(cnt_2 - cnt_1\) 即为结果。
N9. 区间 GCD 查询
给定序列 \(a_1, \dots, a_n, q\) 次询问区间 \([l, r]\) 的 \(\text{gcd}\). (\(n, q \leq 10^5\)).
利用 \(\text{gcd}\) 的结合律特征,用 SegTree 维护.
[讲师补充]
- 更优解法:若题目不涉及修改(纯静态查询),由于 \(\text{gcd}\) 是可重复贡献问题(Idempotent),使用 ST 表 (Sparse Table) 可以做到 \(O(n \log n \cdot \log V)\) 预处理,\(O(\log V)\) 或 \(O(1)\) 单词查询,常数更小。
- 带修情况:若涉及单点修改,线段树是首选;若涉及区间加法,则需维护差分序列的 GCD,利用性质 \(\text{gcd}(a, b) = \text{gcd}(a, b-a)\)。
N10. 费马小定理逆元 \(p = 998244353\),求:\(\sum_{i=2}^n \frac{1}{i} \pmod p\) (\(n \leq 10^7\)).
线性递推求逆元即可.
[讲师补充]
- 线性求逆元公式:
设 \(inv[i]\) 为 \(i \pmod p\) 的逆元,递推式为:
\(inv[i] = (p - \lfloor p/i \rfloor) \cdot inv[p \pmod i] \pmod p\)
初始条件 \(inv[1] = 1\)。该算法在线性时间内完成,完美契合 \(n=10^7\) 的时限要求。- 阶乘逆元法:另一种思路是先算出 \(n!\) 的逆元,再利用 \(inv[i!] \cdot i = inv[(i-1)!]\) 倒推,最后 \(inv[i] = inv[i!] \cdot (i-1)!\)。
H1. 原根判定
给定 \(n\),判断 \(n\) 是否有原根,求最小原根.
关键定理:原根存在定理.
\(n\) 有原根 \(\iff n \in \{1, 2, 4, p^k, 2p^k\}\).
此定理证明复杂,需后期知识补充证明,需了解记忆.
求原根:暴力枚举(一般地,\(g < n^{1/4}\))
每次枚举利用阶的验证算法验证阶 \(\overset{?}{=} \phi(n)\).
[讲师补充]
- 阶的验证算法细节:要验证 \(g\) 是模 \(n\) 的原根,只需检查对于 \(\phi(n)\) 的每一个质因子 \(p_i\),是否均满足:
\[g^{\frac{\phi(n)}{p_i}} \not\equiv 1 \pmod n \]如果全部通过,则 \(g\) 的阶必然等于 \(\phi(n)\)。这避免了暴力计算 \(g^x\) 的所有幂次。- 原根个数:若 \(n\) 有原根,则原根的总个数为 \(\phi(\phi(n))\)。这也是为什么原根在 \(n\) 较大时依然相对容易被“撞”到。
H2. 求群指数
对给定的 \(n\),求 \(\exp(\mathbb{Z}_n^*)\).
解法:直接用 CRT, \(\mathbb{Z}_n^* \cong \prod_i \mathbb{Z}_{p_i^{k_i}}^*\).
而 \(\exp(\mathbb{Z}_n^*) = \text{lcm}_i \{ \exp(\mathbb{Z}_{p_i^{k_i}}^*) \}\). 对奇素数 \(p\),有原根 \(\implies \exp = \phi(p^k)\).
而对于 \(2^k\),需特殊处理.
一般地,\(\exp(\mathbb{Z}_{2^k}^*) = \begin{cases} 1, & k=1 \\ 2, & k=2 \\ 2^{k-2}, & k \ge 3 \end{cases}\)
这是因为 \(\mathbb{Z}_{2^k}^* \cong C_2 \times C_{2^{k-2}} \quad (k \ge 3)\).
这也是 \(2^k (k \ge 3)\) 无原根的原因.(以上内容均超出范围,不作证明,只展示结论).
[讲师补充]
- 卡米歇尔函数 (Carmichael Function):数学上,\(\exp(\mathbb{Z}_n^*)\) 被定义为 \(\lambda(n)\)。你的结论实际上给出了 \(\lambda(n)\) 的构造性定义。
- 群指数的直观理解:\(\exp(G)\) 是群 \(G\) 中元素的最小公倍阶。对于任何 \(a \in \mathbb{Z}_n^*\),都有 \(a^{\lambda(n)} \equiv 1 \pmod n\)。注意 \(\lambda(n)\) 总是整除 \(\phi(n)\),且当 \(\lambda(n) = \phi(n)\) 时,原根存在。
H3. 求 \(\mathbb{Z}_n^{(+)} \to \mathbb{Z}_m^{(+)}\) 的群同态计数.
由于是从循环群的映射,考虑生成元 1. \(\phi(1) \in \mathbb{Z}_m\) 且 \(\phi(n) = \phi(0) = 0\).
\(n\phi(1) \equiv 0 \pmod m \implies \frac{n}{(n,m)}\phi(1) \equiv 0 \pmod{\frac{m}{(n,m)}}\). 则 \(\frac{m}{(n,m)} \mid \phi(1)\).
由 \(\phi(1) \in [0, m)\) 故有 \((n, m)\) 种可能.
另一种视角:由关键性质:\(\phi: G \to H\),若 \(|g| = a, |\phi(g)| = b\),则必有 \(b \mid a\).
故 \(|\phi(1)| \mid n, |\phi(1)| \mid m \implies |\phi(1)| \mid (n,m)\),即 \(\{ g \in \mathbb{Z}_m^+ : g^{(n,m)} = 0 \}\). 在循环群中有 \((n, m)\) 个解. \(\Box\)(不过这需要进一步论证充分性)
[讲师补充]
- 关于充分性的论证:
对于任意满足 \(n \cdot a \equiv 0 \pmod m\) 的 \(a \in \mathbb{Z}_m\),定义映射 \(f(x) = (x \cdot a) \pmod m\)。
- 同态性:\(f(x+y) = (x+y)a = xa + ya = f(x) + f(y) \pmod m\),天然满足。
- 良定义性:若 \(x \equiv y \pmod n\),则 \(x = y + kn\)。那么 \(f(x) = (y+kn)a = ya + k(na) \equiv ya + k(0) \equiv f(y) \pmod m\)。
因此,每一个满足条件的 \(a\) 都唯一确定了一个合法的群同态。- 同态群结构:所有这些同态构成的集合 \(\text{Hom}(\mathbb{Z}_n, \mathbb{Z}_m)\) 在加法下也成群,且 \(\text{Hom}(\mathbb{Z}_n, \mathbb{Z}_m) \cong \mathbb{Z}_{\gcd(n,m)}\)。
H6. (P4556) [Vanevy] 雨天的尾巴
一个 \(n\) 节点树,\(m\) 次操作,每次给 \((u, v)\) 上每个节点发放一个 \(z\) 类型物资。询问每个节点收到最多的物资类型 (\(n, m \le 10^5, z \le 10^5\)).
解法:利用树上差分 + 线段树合并 / DSU on Tree
复杂度时空 \(O(n \log n)\).
[讲师补充]
- 树上差分细节:对于路径 \((u, v)\) 的物资 \(z\),差分操作为:
update(root[u], z, 1),update(root[v], z, 1),update(root[lca(u,v)], z, -1),update(root[fa[lca(u,v)]], z, -1)。- 线段树维护:权值线段树需维护两个信息:当前区间出现次数最多的物资次数
max_cnt及其对应的编号type_id。在合并时,向上 pushup 即可。
H7. (CF1009F) Dominant Indices
给一个 \(n\) 节点有根树,对于每个 \(u\),设 \(d_u(j)\) 为 \(u\) 子树中深度为 \(j\) 的节点数。求 \(d_u(j)\) 最大的最小 \(j\)。(\(\forall u\)).
线段树合并板子题,树上搜索即可.
补:也可使用 DSU on Tree “暴力处理”,\(O(n \log n)\).
[讲师补充]
- 深度处理:这里的深度 \(j\) 建议使用相对深度(即以当前节点 \(u\) 为基准的深度),或者直接使用全局深度。线段树合并时,下标即为深度值。
- 长链剖分优化:此题存在 \(O(n)\) 的解法,即长链剖分。通过指针复用长儿子的信息,仅暴力合并轻儿子的信息,由于总长链长度为 \(n\),复杂度可降至线性。
\(\Delta\) H9. (ABC256H) White and Blue Tabulatings
给定 \(N, Q, A = (a_1, a_2, \dots, a_N)\).
① 将 \(L \sim R\) 的 \(a_i \longleftarrow \lfloor \frac{a_i}{x} \rfloor\). (\(x \ge 2\)).
② 将 \(L \sim R\) 的 \(a_i \longleftarrow y\).
③ 输出 \(\sum_{i=L}^R a_i\).
这个势能分析有些另类.
考虑 \(\Phi = \sum_{p \in Dirty\_Nodes} \log(\max_p)\)
其中 \(Dirty\_Nodes\) 代表节点 \(\max \neq \min\).
\(\Phi\) 良定义:\(\begin{cases} \text{若子树内直} \equiv 0 \implies \text{区间推平} \checkmark \\ \text{下传标记(赋值)不增加势能,反而可能减少} \checkmark \end{cases}\)
区间赋值:\(O(\log N)\) 个节点,最多诱导出 \(O(\log N \cdot \log V)\) 个 \(\Delta \Phi\).
区间整除:
A. 平节点 \(\implies\) 区间赋值 \(O(1)\).
B. 脏节点 \(\implies\) 暴力下行,此节点被下行当且仅当是脏的;
且脏节点至少被 \(/ 2\),势能 \(-1\). 代价 \(O(1)\).
总复杂度:
破坏势能:\(O(1) / O(1)\).
总势能:\(O(n \log V) + m \cdot O(\log N \log V)\).
复杂度:\(O((n+m) \log N \log V)\). \(\Box\)
[讲师补充]
- Segment Tree Beats!:这属于典型的“线段树击打”技术。核心在于:当区间整除操作作用于一个“平节点”(\(\max = \min\))时,整除等价于一次区间赋值(赋值为 \(\lfloor \max / x \rfloor\))。
- 关于“平节点”的判定:在代码实现中,我们需要维护每个线段树节点的
max和min。如果 \(\lfloor \max / x \rfloor = \lfloor \min / x \rfloor\),则直接进行区间覆盖并打上 Lazy Tag,否则才递归进入子节点。- 势能消耗的直观理解:区间整除会让数值迅速变小(对数级减小),而区间赋值虽然会产生新的“脏节点”,但每次赋值产生的脏节点路径长度仅为 \(O(\log N)\)。因此总的下行次数被严格限制。
H10. 一个 \(n\) 节点有根树,\(a_i\),\(q\) 次询问,每次询问 \(u \to v\) 上第 \(k\) 小值.
主席树,昨日原题.
[讲师补充]
- 树上主席树逻辑:要在树上维护路径信息,我们需要对每个节点 \(u\) 建立一棵权值线段树,其内容为从根节点到 \(u\) 路径上所有点的权值。
- 路径计算公式:利用差分思想,路径 \(u \to v\) 的权值分布可以通过四棵线段树合成:
T(u) + T(v) - T(LCA(u,v)) - T(fa(LCA(u,v)))。这样即可在 \(O(\log V)\) 时间内完成单次第 \(k\) 小查询。
H11.(同构判定) 给两个有限群 \(G, H\) 的乘法表,判断是否同构 (\(n < 30\)).
解法:最小生成元算法 (Cayley 表).
① 检查元素阶是否完全相同
② 在 \(G_1\) 中找一个极大生成元 \(S = \{g_1, g_2, \dots, g_k\}\),使 \(\langle S \rangle = G\). (一般地,\(k \le \log n\))
找一个 \(\phi: G_1 \to G_2\) 在 \(G_2\) 中枚举 \(h_1, h_2, \dots, h_k\) 与 \(g_1, \dots, g_k\) 阶数相同.
利用搜索方法验证 \(\phi\) 的双射性以及同态性. 若成功,则同构.
核心实现方法:“不删档 BFS”:也就是每添加一个生成元,就完成一次完整的 BFS,不能删除队列中节点或重置 vis,只重置队列指针 \(\implies\) 找生成元组.
判断同构:DFS 枚举生成元序列匹配,然后逐一验证同态(按 BFS 树推导),最后看双射.
[讲师补充]
- 生成元规模的数学原理:根据拉格朗日定理的推论,若 \(G\) 是有限群且 \(H < G\) 是真子群,则 \(|H| \le \frac{1}{2}|G|\)。这意味着每增加一个不在当前子群中的生成元,子群规模至少翻倍。因此,任何阶为 \(n\) 的有限群都存在一个大小不超过 \(\log_2 n\) 的生成元集。
- 同态验证的技巧:不需要验证 \(n^2\) 个乘法关系。一旦确定了生成元的映射 \(\phi(g_i) = h_i\),群中任意元素 \(x\) 都可以表示为生成元的乘积。只需验证生成元之间的基本关系(Defining Relations)在映射后是否依然成立即可。
H12. (P5494, 权值线段树综合). 维护 \(n\) 个可重集:
- 将集合 \(p\) 中 \([l, r]\) 的数分裂到新集.
- 合并两个集合.
- 在集合 \(p\) 中插入 \(x\).
- 查询集合 \(p\) 中 \([l, r]\) 内元素个数.
- 查询集合 \(p\) 中第 \(k\) 小.
(\(n, q \le 2 \times 10^5, |V| \le 10^9\))
操作 1:两次裂,一次并(总 \(O(\log n)\),且总节点个数不变,\(\Delta \Phi = 0\)).
操作 2:合并复杂度:删除节点数 \(\le \Phi\).
操作 3:创建一个路径节点,\(\Delta \Phi = O(\log n)\).
操作 4, 5:纯查询,树上二分,\(O(\log n)\). 势能 \(O(m \log n)\).
总复杂度 \(O(m \log n)\). \(\Box\)
[讲师补充]
- 线段树分裂 (Segment Tree Splitting):这是处理此题的关键。对于动态开点的权值线段树,分裂操作可以像平衡树(如 Treap)一样,根据值域或排名将一棵树拆分成两棵。由于 \(|V| \le 10^9\),必须配合动态开点使用。
- 势能分析详解:设 \(\Phi\) 为当前全局所有线段树的节点总数。
- 插入操作增加 \(O(\log V)\) 个节点。
- 分裂操作仅涉及路径拆分,增加 \(O(\log V)\) 个节点。
- 合并操作的核心在于递归时每遇到两个重合节点就合并为一个(销毁一个)。
- 因此,只要总生成的节点数是 \(O(m \log V)\),总的合并复杂度就一定被其约束。
- 空间回收:在合并删除节点时,务必将废弃节点的编号加入垃圾池(回收队列),否则在 \(2 \times 10^5\) 的量级下可能会 MLE。
第二档习题集
E1. (CF1748E)
给定 \(n\) 长度序列,对满足以下条件的 \(b_n\) 计数:
- \(1 \le b_i \le m\)
- \(\forall 1 \le l \le r \le n\), \(a, b\) 在 \([l, r]\) 上的 leftmost-max 索引位置相同.
(\(2 \le n, m \le 2 \times 10^5, nm \le 10^6\))
解法:
考虑类似笛卡尔树的结构:构建一个 dfs 序为索引 \(1 \sim n\) 的树,找出最左侧最大值,其左侧 \(< w\),右侧 \(\le w\),在子树中递归建树.
考虑 DP (\(O(nm)\)): \(dp[u, v] = \left[ \sum_{i=1}^{v-1} dp[ls, i] \right] \left[ \sum_{j=1}^v dp[rs, j] \right]\).
[讲师补充]
- 笛卡尔树唯一性:由于题目要求的是 "leftmost-max",这唯一确定了一棵以 \((val_i, id_i)\) 为二元组(\(val\) 大者优先,\(id\) 小者优先)的笛卡尔树。两个序列满足条件当且仅当它们的笛卡尔树形态完全一致。
- DP 状态优化:令 \(S(u, v) = \sum_{i=1}^v dp[u, i]\) 为前缀和。则转移方程可简化为 \(dp[u, v] = S(ls, v-1) \cdot S(rs, v)\)。这使得单层转移达到 \(O(m)\),总复杂度 \(O(nm)\)。
- 空间注意:由于 \(nm\) 可能达到 \(10^6\),建议使用
std::vector动态分配 DP 数组空间,防止静态数组溢出。
E2. (CF1672H)
给定一个 01 串 \(s\),一次操作选择一个包含相邻不同字符的子串并删除,求将子串清空的最少操作次数. (\(n, q \le 2 \times 10^5\)).
数数:看有多少个 \(000\dots, 111\dots\) 扎堆的情况. 由于只要存在扎堆,就能同时消一对 0, 1,直至没有 0 或 1. 因此需 \(\max(x, y) + 1\) 步.
用线段树维护每段区间内的 \(c_0, c_1\) 即可. \(O(q \log n)\).
[讲师补充]
- 性质推导:核心观察在于“相邻不同字符”的删除不会改变序列中“相邻相同字符”对的总数。令 \(x\) 为相邻 '00' 的对数,\(y\) 为相邻 '11' 的对数。
- 操作影响:单次操作最多能同时减少一个 '00' 和一个 '11'(例如删去
...0[01...01]1...)。当其中一种对数耗尽后,只能每次消去剩下的那一种。因此总步数为 \(\max(x, y) + 1\)。- 线段树节点合并:每个节点维护 \(cnt00\) 和 \(cnt11\),合并时:
node.cnt00 = L.cnt00 + R.cnt00 + (L.last == '0' && R.first == '0' ? 1 : 0)。
E5. 维护序列 \(a_1, \dots, a_n\),支持:
- \([l, r] \times v\)
- \([l, r] + v\)
- 查询 \(\sum_{i=l}^r a_i^k \pmod p\).
(\(n, q \le 10^5, p \le 10^9, k \le 10\)).
解:此题关键点在于维护 2, 3 操作的平衡. 考虑二项式定理以及 \(k \le 10\):
\((a+v)^j = \sum \binom{j}{i} a^i v^{j-i}\) 来批量求和. 每个线段树节点维护个小矩阵,
\(\begin{pmatrix} \sum (a+v)^0 \\ \sum (a+v)^1 \\ \vdots \\ \sum (a+v)^k \end{pmatrix} = \begin{pmatrix} \binom{0}{0}v^0 & & & \\ \binom{1}{0}v^1 & \binom{1}{1}v^0 & & \\ \vdots & \vdots & \ddots & \\ \binom{k}{0}v^k & \binom{k}{1}v^{k-1} & \dots & \binom{k}{k}v^0 \end{pmatrix} \begin{pmatrix} \sum a^0 \\ \sum a^1 \\ \vdots \\ \sum a^k \end{pmatrix}\)
区间乘法即 \(\text{diag}(v^0, v^1, \dots, v^k)\).
[讲师补充]
- 复杂度平衡:每个线段树节点存储一个长度为 \(k+1\) 的向量(维护 \(\sum a^0 \dots \sum a^k\))。
- 区间加法:向量与下三角矩阵相乘。由于矩阵形态特殊(杨辉三角权重),可以在 \(O(k^2)\) 时间内更新一个节点。
- 区间乘法:向量与对角矩阵相乘,仅需 \(O(k)\)。
- Lazy Tag 顺序:与标准线段树一致,遵循“先乘后加”的原则。当接收到乘法标记 \(mul\) 时,不仅要更新当前值的和,还要更新加法标记 \(add \leftarrow add \times mul\)。
- 预处理:由于 \(k\) 很小,建议预处理出组合数 \(\binom{j}{i}\) 以及 \(v\) 的各次方,以进一步优化常数。
E6. (Project Euler 271)
求满足 \(x^3 \equiv 1 \pmod{2 \times 3 \times 5 \times 7 \times \dots \times 31}\) 的所有 \(1 \le x < n\) 之和.
直接上 CRT:
\(\begin{cases} x^3 \equiv 1 \pmod 2 \\ \vdots \\ x^3 \equiv 1 \pmod{31} \end{cases}\)
对于每个 \(x^3 \equiv 1 \pmod p\),等价于 \(x\) 在 \(p\) 中阶为 \((3, p-1)\) 的子群中,有 \((3, p-1)\) 个解. 在每个小素数中枚举出这些解,最后利用 CRT 的构造公式组合出解.
总解数:\(\prod c_i\). 构造:\(\sum a_i \cdot M_i \cdot M_i^{-1} \pmod{p_i}\).
[讲师补充]
解数的精确判定:
对于 \(x^k \equiv 1 \pmod p\)(\(p\) 为素数):
- 若 \(p=2\),只有 \(x=1\) 一个解。
- 若 \(p=3\),由费马小定理 \(x^3 \equiv x \pmod 3\),故 \(x \equiv 1 \pmod 3\),仅一个解。
- 对于其他素数 \(p > 3\),由于 \(\mathbb{Z}_p^*\) 是阶为 \(p-1\) 的循环群,方程的解数恰好为 \(\gcd(3, p-1)\)。
- 若 \(p \equiv 1 \pmod 3\)(如 \(7, 13, 19, 31\)),方程有 3 个解(1 加上两个 3 阶元)。
- 若 \(p \equiv 2 \pmod 3\)(如 \(5, 11, 17, 23, 29\)),方程仅有 1 个解(即 \(x=1\))。
搜索实现逻辑:
由于 \(n\) 的规模约为 \(1.3 \times 10^{12}\),且解的总数并不多(在本题中,总解数为 \(1^7 \times 3^4 = 81\) 个,除去 \(x=1\) 后需计算 80 个解),我们可以采用 DFS(深度优先搜索):
- 预处理每个 \(p_i\) 的解集 \(S_i\)。
- 递归每一层 \(p_i\),从 \(S_i\) 中选一个解 \(a_i\)。
- 利用 CRT 累加贡献。为了计算方便,可以预处理 \(C_i = M_i \cdot (M_i^{-1} \pmod{p_i})\),则 \(x = (\sum a_i C_i) \pmod n\)。
结果计算:
题目要求的是所有 \(x\) 之和(排除 \(x=1\))。在实现时,建议使用__int128或在大数类中进行累加,以防在计算 \(\sum a_i C_i\) 时溢出(虽然最终结果对 \(n\) 取模后会回到 64 位范围内)。

浙公网安备 33010602011771号