CF1872C题解

题目大意

给出 l,rl,r,构造一组 a,ba,b 使满足以下条件:

  • la+brl \le a+b \le r
  • gcd(a,b)1\gcd(a,b) \neq 1

思路

要使 gcd(a,b)1\gcd(a,b) \neq 1,也就是 aabb 不互质,最简单的就是 bab \mid aaba \mid b

实现

枚举 iigcd(a,b)\gcd(a,b) 也就是 min(a,b)\min(a,b),找到一个 kk 使 krk \le riki\mid k,若 k<lk<l 则无解,枚举下一个 ii。若 klk \ge l 则再特判 min(i,ki)\min(i,k-i) 是否为 11,是则跳过此 ii,否则输出 iikik-i

代码很简单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#pragma GCC optimize(2,3,"Ofast","inline")
#include<iostream>
using namespace std;
int t,l,r,a,b;
int main(){
cin>>t;
while(t--){
cin>>l>>r;
for(int i=2;i*i<=r;++i){//这里与判质数同理
int k=r/i;
k*=i;
if(k<l)//a+b是否在l与r之间
continue;
if(min(i,k-i)!=1){//再特判
cout<<i<<' '<<k-i<<endl;
goto end;//跳出循环
}
}
cout<<"-1\n";
end:
continue;
}
}