题解:
先求出a,b的gcd,然后求出gcd的所有因子(数目不会超过10^5)并sort,然后二分查找或者upper_bound().
AC代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 2e5+10;
LL gcd(LL a, LL b)
{
return b == 0? a:gcd(b,a%b);
}
int a,b,q;
int ans[maxn];
int main()
{
int j = 0;
scanf("%d%d",&a,&b);
int c = gcd(a,b);
for(int i = 1; i <= sqrt(c+0.5); i++)
if(c % i == 0) {ans[j++] = i;if(i != c/i)ans[j++] = c/i;}
sort(ans,ans+j);
scanf("%d",&q);
int l,r;
for(int i = 0; i < q; i++)
{
scanf("%d%d",&l,&r);
int k = upper_bound(ans,ans+j,r)-ans;
if(k-1 >= 0 && k-1 < j && ans[k-1] >= l) printf("%d\n",ans[k-1]);
else printf("-1\n");
}
return 0;
}