Well, here is another math class task. In mathematics, GCD is the greatest common divisor, and it's an easy task to calculate the GCD between two positive integers.
A common divisor for two positive numbers is a number which both numbers are divisible by.
But your teacher wants to give you a harder task, in this task you have to find the greatest common divisor d between two integers a and b that is in a given range from low to high (inclusive), i.e. low ≤ d ≤ high. It is possible that there is no common divisor in the given range.
You will be given the two integers a and b, then n queries. Each query is a range from low to high and you have to answer each query.
Input
The first line contains two integers a and b, the two integers as described above (1 ≤ a, b ≤ 109). The second line contains one integer n, the number of queries (1 ≤ n ≤ 104). Then n lines follow, each line contains one query consisting of two integers, low and high (1 ≤ low ≤ high ≤ 109).
Output
Print n lines. The i-th of them should contain the result of the i-th query in the input. If there is no common divisor in the given range for any query, you should print -1 as a result for this query.
Example
Input
9 27
3
1 5
10 11
9 11
Output
3
-1
9
题意:给你两个数,再给你一个范围,问是否在这个范围里存在这两个数的公约数。
思路:先用求出这两个数的最大公约数,然后求这个最大公约数的约数,再看范围内是否存在。
这里有一个快速求所有公约数的方法:
先求出 GCD(a , b ) = g;
然后找g的约数即可,(从1到sqrt(g)枚举)。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int cd[1000000];
int gcd(int a,int b){
if(b==0)
return a;
else
return(gcd(b,a%b));
}
int main()
{
int a,b,n;
scanf("%d%d",&a,&b);
int maxn=gcd(a,b);
int t=0;
for(int i=1;i*i<=maxn;i++){
if(maxn%i==0){
cd[t++]=i;
cd[t++]=maxn/i;
}
}
sort(cd,cd+t);
scanf("%d",&n);
while(n--){
int low,high,temp=0,ans=0;
scanf("%d%d",&low,&high);
for(int i=0;i<t;i++){
if(cd[i]>=low&&cd[i]<=high){
temp=1;
ans=max(ans,cd[i]);
}
}
if(temp)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}