1 条题解
-
0
题目大意
给定一个区间 (),求其中包含的最小互质区间的数量。
- 区间 是互质区间当且仅当 。
- 互质区间 是最小互质区间当且仅当它不包含任何不等于自身的互质子区间。
解题思路
通过分析可知,所有最小互质区间只有两类:
-
长度为 的区间:。
因为 互质当且仅当 (),且它没有真子区间,所以 是最小互质的。 -
长度为 的区间:,其中 。
- 相邻整数一定互质,所以 是互质区间。
- 它的真子区间只有 和 ,由于 ,这两个单点区间都不互质,因此 是最小互质的。
其他任何区间要么本身不互质,要么包含上述两类中的某个作为真子区间,因此都不是最小互质区间。
计数方法
给定 ,我们需要统计所有满足 且 的 的个数,再加上可能存在的 。
-
条件 等价于 且 ,即 。
同时要求 ,所以 的取值范围是 。
若 ,则个数为 ;否则为 。 -
被包含当且仅当 ,即 。
分类讨论
- 若 :此时只有 ,答案为 。
- 若 且 :
贡献 ;
的范围为 ,个数为 ;
总数为 。而 ,所以答案为 。 - 若 :
不存在;
的范围为 ,个数为 ;
所以答案为 。
综上,除了 时答案为 ,其余情况答案均为 。
由于 时 ,而正确答案是 ,因此只需要特判这一种情况。
时间复杂度
每个测试用例 ,总复杂度 ,可以轻松通过。
代码实现(C++)
#include <iostream> using namespace std; int main() { int t; cin >> t; while (t--) { int l, r; cin >> l >> r; if (l == 1 && r == 1) cout << "1\n"; else cout << r - l << "\n"; } return 0; }示例验证
以题目样例为例:
输入 输出 计算 ,正确 (注意 ) 特判 与题目输出完全一致。
- 1
信息
- ID
- 7282
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者