掛機水題日記 Cf
阿新 • • 發佈:2018-12-21
題意:
給你兩個數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; } }