给定两个整数 l≤r 。你需要找到正整数 a 和 b ,使得同时满足以下条件:
l≤a+b≤r gcd(a,b)≠1 如果找不到满足条件的整数,则报告不存在。
gcd(a,b) 表示数字 a 和 b 的最大公约数。例如,gcd(6,9)=3 ,gcd(8,9)=1 ,gcd(4,2)=2 。
输入 输入的第一行包含一个整数 t (1≤t≤500 ) —— 测试用例的数量。
然后是每个测试用例的描述。
每个测试用例的描述仅包含一行,包含 2 个整数 l,r (1≤l≤r≤107 )。
输出 对于每个测试用例,输出满足所有条件的整数 a,b ,每个输出占一行。如果没有答案,输出一个数字 −1 。
如果存在多个答案,你可以输出其中任意一个。
示例 1 Inputcopy 11
11 15
1 3
18 19
41 43
777 777
8000000 10000000
2000 2023
1791791 1791791
1 4
2 3
9840769 9840769
output
6 9
-1
14 4
36 6
111 666
4000000 5000000
2009 7
-1
2 2
-1
6274 9834495
注意 在第一个测试用例中,11≤6+9≤15 ,gcd(6,9)=3 ,并且所有条件都满足。注意这不是唯一可能的答案,例如,{4,10},{5,10},{6,6} 也是这个测试用例的有效答案。
在第二个测试用例中,唯一满足条件 1≤a+b≤3 的对 {a,b} 是 {1,1},{1,2},{2,1} ,但在这些对中 gcd(a,b) 等于 1 ,因此没有答案。
在第三个示例测试中,gcd(14,4)=2
代码如下
#include <iostream>
using namespace std;
int mark;
int gcd(int x,int y){
int tmp=0;
while (tmp = x % y)
{
x = y;
y = tmp;
}
return y;
}
int find(int l,int r,int mid){
if (l>r) return -1;
for (int i=2;i<=mid/2;i++){
if (gcd(i,mid-i)==1) {
continue;
}
else {
mark=i;
return mid-i;
}
}
int f1=find(l,mid-1,(l+mid-1)/2);
int f2=find(mid+1,r,(mid+1+r)/2);
if (f1==-1&&f2==-1) return -1;
}
int main (){
int n;
cin>>n;
for (int i=1;i<=n;i++){
int l,r,mid;
cin>>l>>r;
mid=(l+r)/2;
if (find(l,r,mid)!=-1)
cout<<mark<<" "<<find(l,r,mid)<<endl;
else cout<<-1<<endl;
mark=0;
}
return 0;
}