1 条题解
-
0
1. 核心数学推导
题目的目标是求:
$$\sum_{i=1}^A \sum_{j=1}^B \sum_{k=1}^C d(ijk) \pmod{10^9+7} $$步骤一:展开
直接计算 很困难,利用 的一个重要恒等式:
$$d(ijk) = \sum_{x|i} \sum_{y|j} \sum_{z|k} [\gcd(x, y) = 1] [\gcd(y, z) = 1] [\gcd(z, x) = 1] $$代入原式,并交换求和顺序(先枚举 ),得到:
$$\sum_{x=1}^A \sum_{y=1}^B \sum_{z=1}^C \lfloor \frac{A}{x} \rfloor \lfloor \frac{B}{y} \rfloor \lfloor \frac{C}{z} \rfloor [\gcd(x, y) = 1] [\gcd(y, z) = 1] [\gcd(z, x) = 1] $$步骤二:莫比乌斯反演
利用 将 条件展开。 设 , , 。 原式变形为枚举 :
$$\sum_{u, v, w} \mu(u)\mu(v)\mu(w) \sum_{x: u|x, w|x} \lfloor \frac{A}{x} \rfloor \sum_{y: u|y, v|y} \lfloor \frac{B}{y} \rfloor \sum_{z: v|z, w|z} \lfloor \frac{C}{z} \rfloor $$注意到 必须是 的倍数,同理 是 的倍数, 是 的倍数。 定义辅助函数 $F(N, K) = \sum_{i=1}^{\lfloor N/K \rfloor} \lfloor \frac{N}{i \cdot K} \rfloor$。 代码中的
f[0][i]、f[1][i]、f[2][i]分别预处理了 对应的这个和值。例如f[0][u]实际上存储的是 ,这与 等价(注意这里 代表 LCM)。最终式子转化为:
$$\sum_{u, v, w} \mu(u)\mu(v)\mu(w) \cdot f_A(\text{lcm}(u, w)) \cdot f_B(\text{lcm}(u, v)) \cdot f_C(\text{lcm}(v, w)) $$这本质上是在寻找三元组 ,使得贡献总和最大。这就变成了一个图论问题:
- 节点是 。
- 边 的权重是 。
- 我们需要统计所有三元环(及退化的点、边)的贡献。
2. 代码逻辑解析
2.1 预处理 (
Init函数)- 线性筛:计算 函数。
- 计算 f 数组:
这里for (int j = i ; j <= n ; j += i) { f[ 0 ][ i ] = (f[ 0 ][ i ] + A / j) % Mod; // ... B和C同理 }f[0][i]计算的是所有 的倍数 的 之和,这正是推导公式中的核心部分。
2.2 建图 (
Solve函数前半部分)我们需要枚举有效的 对。 代码通过枚举 ,然后枚举 互质来实现:
for (int d = 1 ; d <= n ; d ++) for (int i = 1 ; i <= n / d ; i ++) for (int j = i + 1 ; j <= n / i / d ; j ++)- , 。
- 即为 。
- 边的生成:如果 和 都不为 0,则连接边 ,边权为 。
关于两点贡献的处理: 在建边的同时,代码顺便计算了 中有两个数相等的情况(退化的三元环,即在一条边上来回):
Calc(u, l, l)等项处理了如 或 的情况。
2.3 三元环计数 (
Solve函数后半部分)这是解决本题复杂度的关键。如果我们暴力枚举 ,复杂度是 或 ,无法接受。 代码使用了 三元环计数 的经典优化算法:
-
重定向边: 将无向图转为有向图。规则是:度数小的指向度数大的;度数相同则编号小的指向编号大的。
if (Deg[ u ] < Deg[ v ] || (Deg[ u ] == Deg[ v ] && u < v)) Graph[ u ].push_back({ v, w });这样可以保证每个点的出度不超过 。
-
枚举三元环: 枚举 ,再枚举 。检查 是否有边连接(通过
vt数组标记)。// 枚举 u -> v for (int i = 0 ; i < Graph[ u ].size() ; i ++) { // 枚举 v -> w for (int j = 0 ; j < Graph[ v ].size() ; j ++) { // 检查 u, w 是否连通 (vt[w]存储了 u->w 的边权) if (vt[ w ]) { ... } } }这个过程的时间复杂度是 ,其中 是边数。
-
计算贡献: 对于找到的三元环 ,计算其贡献:
mu[u] * mu[v] * mu[w] * (所有6种排列的 f 值乘积之和)。 因为 不同,所以 和 等都需要累加。
3. 复杂度分析
- 预处理:,用于计算
f数组。 - 建图:枚举 的复杂度大约是 或者接近 ,生成的边数 在本题数据范围内也是稀疏的。
- 三元环计数:。
由于 ,这种复杂度完全可以通过。
4. 总结
这份代码通过以下步骤解决了问题:
- 莫比乌斯反演将 转化为关于 的式子。
- 将式子转化为图论模型:点权为 ,边权为 对应的 值。
- 利用三元环计数算法高效统计 互不相同的情况。
- 在建图过程中统计 有重复的情况。
这是一种处理多变量 GCD/LCM 求和问题的通用且高效的高级技巧。
- 1
信息
- ID
- 6142
- 时间
- 12000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者