求助水题
  • 板块灌水区
  • 楼主KLeonard
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/1/27 19:35
  • 上次更新2024/1/27 21:34:51
查看原帖
求助水题
1249582
KLeonard楼主2024/1/27 19:35

给定两个整数 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;
}
2024/1/27 19:35
加载中...