题解:CF2043D Problem about GCD
题目链接
- CF2043D Problem about GCD
- 洛谷站内链接
题意简述
给出三个整数
如果有多组解,选择
解题思路
首先
关于如何求区间内最远互质点对,可以参考 Atcoder arc137_a(站内链接)。
如果直接暴力枚举
但是其实并不会遍历那么多次,参考上面给出的题解可知在题目给出的
所以尽管并未算出实际复杂度期望,但是我们暴力枚举仍然可以通过本题。
参考代码
#include <bits/stdc++.h>
using namespace std;
long long T , l , r , g;
long long gcd(long long aa , long long bb) {return bb ? gcd(bb , aa % bb) : aa;}
void solve()
{
long long len = r - l;
while(len >= 0)
{
for(long long i = l ; i <= r - len ; i++) if(gcd(i , i + len) == 1) {cout << i * g << " " << (i + len) * g << '\n'; return;}
len--;
}
cout << -1 << " " << -1 << '\n';
}
int main()
{
cin.tie(nullptr)->sync_with_stdio(false);
cin >> T;
while(T--)
{
cin >> l >> r >> g;
l += g - 1; l /= g; r /= g;
solve();
}
return 0;
}
补充
以下是不严谨的关于该代码时间复杂度的证明。
参考资料
- 维基百科 克拉梅尔猜想
证明
在维基百科的这一条目中提到,托马斯·雷·奈斯利使用了公式
因此该题目中最大的素数间隙(设其为
在该题目中,能够构造出的最坏情况为
又因为我们已经证明了