鏈接:http://codeforces.com/problemset/problem/75/C
題意:
給你兩個數a ,b(1e9範圍內),q個查詢區間 [ l, r],問你這些區間內能找到的 a 和 b 的公因子最大是多少。
思路:
水題,枚舉 gcd 因子的時候開平方優化完就過了。
核心思路就是枚舉 gcd (a, b) 的因子,用max維護一下,那麼枚舉的過程中,如果a,b 的 gcd 過大,那 O( gcd(a, b) )就 T定了,所以開平方優化以下,令 dd = __gcd(a, b),然後在 sqrt(dd)之前正常枚舉,之後的因子用 dd 與之前枚舉的因子做商,再排下序即可。
我的AC代碼:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxx = 1e5 + 7; const int Inf = 1 << 30; int a, b; int cas; int l, r; int pr[maxx]; //gcd因子 int main() { cin >> a >> b; //枚舉gcd因子 + 平凡根優化複雜度 int dd = __gcd(a, b); int t = 0; for(int i = 1; i <= sqrt(dd); i++) { if(dd % i == 0) pr[++t] = i; } int pos = t; for(int i = 1; i <= pos; i++) pr[++t] = dd / pr[i]; sort(pr + 1, pr + t + 1); cin >> cas; while(cas--) { cin >> l >> r; bool flg = 0; int ans = 0; for(int i = 1; i <= t; i++) { if(pr[i] > r) break; else { if(pr[i] < l) continue; else { flg = 1; ans = max(ans, pr[i]); } } } if(!flg) puts("-1"); else cout << ans << endl; } }