传送门
题目大意
找出 a , b a,b a,b的最大公因子,然后给几个查询,每次查询包含 l , r l,r l,r两个数字,查询在 l , r l,r l,r之间的 a , b a,b a,b的最大公因子
思路
先找到 a , b a,b a,b的最大公约数 g c d gcd gcd,将 g c d gcd gcd的因子求出来,每次询问二分寻找小于 r r r的最大的因子,看看是否大于等于 l l l即可。
代码
int gcd(int a,int b){
return !b?a:gcd(b,a%b);
}
int x[maxn];
int main(){
int a,b;
scanf("%d%d",&a,&b);
int tmp=gcd(a,b);
int q=0;
for(int i=1;i*i<=tmp;i++){
if(tmp%i==0){
x[++q]=i;
if(i*i!=tmp)
x[++q]=tmp/i;
}
}
sort(x+1,x+1+q);
int n;
scanf("%d",&n);
while(n--){
int l,r;int lll,rr;
scanf("%d%d",&l,&r);
lll=1;rr=q;
int ans=-1;
while(lll<=rr){
int mid=(lll+rr)/2;
if(x[mid]<=r){
ans=mid;
lll=mid+1;
}
else{
rr=mid-1;
}
}
if(x[ans]>=l){
printf("%d\n",x[ans]);
}
else{
puts("-1");
}
}
}