BZOJ3834 [Poi2014]Solar Panels

我和数论没完了。。

这题就是要找 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 }
View Code
By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
原文地址:https://www.cnblogs.com/rausen/p/4294442.html