1. 程式人生 > >掛機水題日記 Cf

掛機水題日記 Cf

題意:

給你兩個數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;
	}
}