1 条题解
-
0
E. Interesting Ratio 详细题解
一、问题重述
定义函数:
$$F(a,b) = \frac{\operatorname{lcm}(a,b)}{\gcd(a,b)} $$称 是“有趣的”,如果 且 是质数。
给定 ,求满足 且 为质数的有序对 的数量。
二、核心推导
2.1 化简
设 ,则存在互质的正整数 使得:
$$a = d \cdot x,\quad b = d \cdot y,\quad \gcd(x,y)=1 $$此时:
因此:
2.2 质数条件
为质数,且 为正整数、互质。
由于质数只有两个正因子 和自身,且 是质数,则必有一个为 ,另一个为质数。又因为 $a < b \implies d \cdot x < d \cdot y \implies x < y$,所以:
于是:
且 自动成立,因为 与 互质。
2.3 问题转化
条件等价于:
- 选择一个质数
- 选择一个正整数 ,使得
即 。
对于每个固定的质数 , 可以取 ,共 个取值。
2.4 最终答案
对所有不超过 的质数 求和:
$$\text{ans}(n) = \sum_{p \le n,\ p\ \text{prime}} \left\lfloor \frac{n}{p} \right\rfloor $$
三、算法实现
- 用埃氏筛预处理 内的质数表
- 对每个测试用例,遍历所有 的质数,累加
- 时间复杂度: 每个用例,总 ,可接受
四、标程代码
#include <iostream> using namespace std; const int MAXN = 10000001; bool prime[MAXN]; void solve() { int n; cin >> n; long long ans = 0; // 注意答案可能超过 int 范围 for (int i = 2; i <= n; i++) { if (prime[i]) { ans += n / i; } } cout << ans << endl; } int main() { // 初始化质数标记 for (int i = 0; i < MAXN; i++) prime[i] = true; prime[0] = prime[1] = false; // 埃氏筛 for (int i = 2; i * i < MAXN; i++) { if (!prime[i]) continue; for (int j = i * i; j < MAXN; j += i) { prime[j] = false; } } int t; cin >> t; while (t--) { solve(); } return 0; }
五、示例验证
示例 1:
质数 :
- : → →
- : → →
- : → → 总数 ✅
示例 2:
质数:
- :
- :
- :
- : 总和 ✅
示例 3:
质数 求和:计算得 ✅
六、复杂度分析
- 预处理:
- 每个测试用例:
- 总 ,完全可行
七、总结
步骤 操作 1 设 ,, 2 为质数 ⇒ , 为质数 3 ,,约束 4 对每个质数 , 可取 到 5 答案 = 核心公式:
$$\boxed{\text{ans}(n) = \sum_{p\ \text{prime} \le n} \left\lfloor \frac{n}{p} \right\rfloor} $$
- 1
信息
- ID
- 7265
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者