Modified GCD CodeForces - 75C

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

题解:找出a,b的所有公共约数,然后二分查找区间左右端点的位置,分类讨论
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 const int maxn=2e5+10;
 5 
 6 int a,b,n;
 7 int ma[maxn];
 8 
 9 int gcd(int a,int b){
10     if(b==0) return a;
11     return gcd(b,a%b);
12 }
13 
14 int main()
15 {   cin>>a>>b>>n;
16     int g=gcd(a,b),cnt=0;
17     for(int j=1;j<=sqrt(g)+1;j++){
18         if(g%j!=0) continue;
19         ma[cnt++]=j;
20         if(j<g/j) ma[cnt++]=g/j;
21     }
22     sort(ma,ma+cnt);
23     int aa,bb;
24     for(int i=1;i<=n;i++){
25         cin>>aa>>bb;
26         //for(int j=0;j<cnt;j++) cout<<ma[j]<<endl;
27         int pos1=lower_bound(ma,ma+cnt,aa)-ma;
28         int pos2=lower_bound(ma,ma+cnt,bb)-ma;
29         //cout<<pos1<<" "<<pos2<<endl;
30         if(pos1==pos2){
31             if(ma[pos2]==bb) cout<<bb<<endl;
32             else cout<<"-1"<<endl;
33         }
34         else{
35             if(ma[pos2]==bb) cout<<ma[pos2]<<endl;
36             else cout<<ma[pos2-1]<<endl;
37         }
38     }
39     return 0;
40 }

 

posted @ 2017-10-21 23:37  天之道,利而不害  阅读(387)  评论(0编辑  收藏  举报