markdown复制## 1. 题目背景与核心考察点
洛谷P10262"亲朋数"是一道经典的算法竞赛模拟题,主要考察选手对整数性质分析和基础算法优化的掌握能力。题目要求:对于给定的正整数n,定义其"亲朋数"为所有小于n且与n互质的正整数之和。需要高效计算多个查询的亲朋数值。
这道题融合了三个关键知识点:
- 欧拉函数性质(互质数判定)
- 前缀和预处理技巧
- 查询优化策略
在实际竞赛中,这类题目常出现在省选/NOIP中档难度题型中,是区分选手基础算法功底的重要标尺。
## 2. 互质数判定与欧拉函数
### 2.1 互质数定义
两个数互质意味着它们的最大公约数(GCD)为1。计算GCD的经典方法是欧几里得算法:
```cpp
int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
2.2 欧拉函数特性
欧拉函数φ(n)表示小于n的正整数中与n互质的数的个数。虽然本题要求的是这些数的和而非个数,但欧拉函数的性质仍具有参考价值:
- 当n为质数时,φ(n) = n-1
- 若n=p^k(p为质数),φ(n) = p^k - p^(k-1)
- 对于互质的m,n,φ(mn) = φ(m)φ(n)
注意:直接套用欧拉函数公式无法得到本题要求的"和",但可以帮助理解互质数的分布规律
3. 暴力解法与性能分析
3.1 基础实现
最直观的做法是对每个查询n,遍历1到n-1所有数,累加满足gcd(i,n)==1的数:
cpp复制int solve_naive(int n) {
int sum = 0;
for (int i = 1; i < n; ++i) {
if (gcd(i, n) == 1) {
sum += i;
}
}
return sum;
}
3.2 时间复杂度
对于Q次查询,最大数值N:
- 单次查询:O(N log N)(gcd复杂度为O(log N))
- 总体复杂度:O(QN log N)
当Q和N达到1e5量级时,这种解法必然超时
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
4. 数学优化思路
4.1 关键数学性质
发现一个重要规律:对于
