这题我打表找规律死活没有搞出来,最后还是看了题解,我总感觉AtCoder的题解写的比CF的好…
时间限制是两秒n取到2e5,O(n^2)就不用想了
因为它问的是gcd(x,y)max,所以我们可以考虑枚举gcd(x,y)max = c,再判断在区间[A,B]是否存在两个不相同的数使他们的gcd == c,其实我也想到了这个。。。。但我不知道咋判断是否存在这两个数。
判断说起来也很简单就是看在这个区间上是否存在2个以上c的倍数,很明显 c * k 和 c * (k + 1) 因为k 和 k + 1互质所以他们的gcd就是c;
找个数的方法 A / c 为1 到 A 中为c的倍数的个数,同理 B / c。只要当A / c - B / c >= 1 就可以了。
这里还有一个要点,B / c 可能为0当A / c = 1时这样也是不行的,所以我们把B / c 向上取整让它至少为1就可以了。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> P;
const int maxn = 1e5 + 10;
const int M_MAX = 50000 + 10;
const int mod = 1e9 + 7;
const LL INF = 1e17;
const double eps = 1e-6;
int gcd(int x, int y) {
if(y == 0) return x;
return gcd(y, x % y);
}
int a, b;
void solve() {
cin >> a >> b;
for(int i = b; ; i--) {
if(b/i - (a+i-1)/i >= 1) {
cout << i << endl;
return ;
}
}
}
int main()
{
ios::sync_with_stdio(false);
//freopen("D:\\in.txt", "r", stdin);
solve();
return 0;
}