单点时间:1s,内存限制:512MB
(真签到题,只不过赛时心态爆炸了,脑子掉二分里了,答案不连续不能使用二分)
L和R如题所示,设g为符合条件的一个gcd,k为正整数,则必定有
则k, g必定符合 ,
从[1, 1e6]枚举k, g即可(当k∈[1, 1e6],g∈[1e6, 1e12])
AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve() {
ll L, R;
cin >> L >> R;
ll ans = 1;
for (ll i = 1; i <= 1e6; i++) {
ll g1 = ceil(L * 1.0 / i);
ll g2 = R / (i + 1);
if (g2 >= g1) ans = max(ans, g2);
ll k = (R / i) - 1;
if (g1 <= k) ans = max(ans, i);
}
cout << ans << '\n';
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}