[CF2043D] Problem about GCD 题解

首先的一个观察是可以把 \(G\) 除掉,转化成 \([\lceil \frac{l}{G} \rceil,\lfloor \frac{r}{G} \rfloor]\) 中的两个互质数的差最大值。
然后的性质非常神奇。令 \(l' \gets \lceil \frac{l}{G} \rceil, r' \gets \lfloor \frac{r}{G} \rfloor\)。若 \(r'-l'\) 充分大,则一定有一组解 \((A,B)\),满足 \(A \in [l', l'+5],B \in [r'-16,r']\)。证明可以去出数学题了()。

证明 首先有引理:

  • 区间 \([l, l+5]\) 中必有一个数与 \(30\) 互质。按模 \(5\) 的剩余系分类易证。

记这个数为 \(a\)\(\le 10^{18}\)),其所有质因子至多有 \(12\) 个,分别大于等于 \(7,11,13,17,19,...,47\)。而连续 \(17\) 个数中,最多 \(3\) 个是 \(7\) 的倍数,\(2\) 个是 \(11\) 的倍数,\(2\) 个是 \(13\) 的倍数,\(1\) 个是 \(17\) 的倍数,……,\(1\) 个是 \(47\) 的倍数。加起来一共 \(16\) “个”。显然不可能全部“铺满”整个区间 \([r'-16,r']\)。故其中至少一个与 \(a\) 互质。得证。

于是暴力枚举 \(800\) 组就结束了。

#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define Linf 0x3f3f3f3f3f3f3f3f
#define pii pair<int, int> 
#define int long long
#define all(v) v.begin(), v.end()
using namespace std;

//#define filename "xxx" 
#define FileOperations() freopen(filename".in", "r", stdin), freopen(filename".out", "w", stdout)


namespace Traveller {
	const int N = 1;
	
	int l, r, G;
	
	void main() {
		cin >> l >> r >> G;
		l = (l + G-1) / G, r /= G;
		if(l > r) {
			cout << "-1 -1\n";
			return;
		}
		if(l == r) {
			if(l == 1) cout << G << ' ' << G << '\n';
			else cout << "-1 -1\n";
			return;
		}
		
		int mxd = 0, ansl = 0, ansr = 0;
		for(int L = l; L <= l+5 && L <= r; ++L)
			for(int R = r; R >= r - 16 && R >= L; --R)
				if(R - L > mxd) {
					if(__gcd(L, R) == 1) mxd = R - L, ansl = L, ansr = R;
				}
		if(ansl) cout << ansl * G << ' ' << ansr * G << '\n';
		else cout << "-1 -1\n";
	}
}

signed main() {
	#ifdef filename
		FileOperations();
	#endif
	
	int _;
	cin >> _;
	while(_--) Traveller::main();
	return 0;
}


posted @ 2025-01-04 19:30  Water_M  阅读(61)  评论(0)    收藏  举报