1 条题解
-
0
「最大公因数和」题解
问题分析
计算 ,其中 最大可达 ,需要高效的数学方法。
核心思路
利用数论变换和欧拉函数性质,将问题转化为对 的所有约数求和。
关键公式推导
设 ,则:
因此:
$$\sum_{i=1}^n \gcd(i, n) = \sum_{d \mid n} d \cdot \varphi\left(\frac{n}{d}\right) $$其中 是欧拉函数。
算法详解
1. 欧拉函数计算
int phi(int n) { int ans = n; // 质因数分解 for (int i = 2; i * i <= n; i++) { if (n % i == 0) { ans = ans / i * (i - 1); // φ(n) = n × ∏(1 - 1/p) while (n % i == 0) n /= i; // 去除所有该质因子 } } // 处理剩余的质因子 if (n > 1) ans = ans / n * (n - 1); return ans; }欧拉函数性质:
2. 主算法
int ans = 0; // 枚举n的所有约数 for (int i = 1; i * i <= n; i++) { if (!(n % i)) { // i是n的约数 ans += phi(i) * (n / i); // 对应约数d = n/i if (i * i != n) ans += phi(n / i) * i; // 对应约数d = i } }算法逻辑:
- 对于每个约数 ,计算
- 通过对称性,同时处理 和
算法正确性
公式验证
对于 ,约数为 :
- :
- :
- :
- :
总和: ✓
等价形式
原公式也可写为:
$$\sum_{i=1}^n \gcd(i, n) = \sum_{d \mid n} \frac{n}{d} \cdot \varphi(d) $$代码中实际使用的是这种形式。
复杂度分析
- 欧拉函数:,最坏情况 为质数
- 约数枚举:,只枚举到
- 总复杂度:
对于 ,约数个数通常很少,算法效率很高。
样例验证
样例:
- 约数:
- $\varphi(1)=1, \varphi(2)=1, \varphi(3)=2, \varphi(6)=2$
- 计算:$1\times6 + 1\times3 + 2\times2 + 2\times1 = 6+3+4+2=15$
关键技巧
- 数论变换:将求和转化为约数求和
- 对称枚举:只枚举到 ,利用对称性
- 欧拉函数:利用质因数分解高效计算
- 整数溢出防护:使用
long long
总结
本题的巧妙之处在于:
- 问题转化:将看似复杂的求和转化为数论问题
- 欧拉函数应用:利用 函数计数互质整数对
- 高效实现:通过数学性质避免暴力计算
- 边界处理:正确处理平方数情况
这种"数学推导 + 高效实现"的方法在解决数论问题时非常有效。
- 1
信息
- ID
- 4081
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者