我和数论没完了。。
这题就是要找 a ∈ [mn1, mx1], b ∈ [mn2, mx2] 的最大 gcd(a, b)
不妨设 mx1 < mx2,如果mn1 > mn2则答案就是mx1
否则我们要找到一个最大的x使得 a ∈ [mn1 / x, mx1 / x], b ∈ [mn2 / x, mx2 / x], 满足gcd(a, b) ≥ 1
分块搞搞,判断一下区间大小≥1就好了
1 /************************************************************** 2 Problem: 3834 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:2152 ms 7 Memory:804 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 #include <algorithm> 12 13 using namespace std; 14 15 int mx1, mn1, mx2, mn2, ans; 16 17 int main() { 18 int T, i, j; 19 scanf("%d", &T); 20 while (T--) { 21 scanf("%d%d%d%d", &mn1, &mx1, &mn2, &mx2); 22 if (mx1 > mx2) 23 swap(mx1, mx2), swap(mn1, mn2); 24 ans = 1; 25 if (mn2 <= mx1 && mx1 <= mx2) ans = mx1; 26 else { 27 --mn1, --mn2; 28 for (i = mx1; i; i = j) { 29 j = max(mx1 / (mx1 / i + 1), mx2 / (mx2 / i + 1)); 30 if (mn1 >= i) j = max(j, mn1 / (mn1 / i + 1)); 31 if (mn2 >= i) j = max(j, mn2 / (mn2 / i + 1)); 32 if (mx1 / i - mn1 / i > 0 && mx2 / i - mn2 / i > 0) { 33 ans = i; 34 break; 35 } 36 } 37 } 38 printf("%d ", ans); 39 } 40 return 0; 41 }