CF1872C题解

题目大意

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

  • l≤a+b≤rl \le a+b \le r
  • gcd⁡(a,b)≠1\gcd(a,b) \neq 1

思路

要使 gcd⁡(a,b)≠1\gcd(a,b) \neq 1,也就是 aa 与 bb 不互质,最简单的就是 b∣ab \mid a 或 a∣ba \mid b。

实现

枚举 ii 为 gcd⁡(a,b)\gcd(a,b) 也就是 min⁡(a,b)\min(a,b),找到一个 kk 使 k≤rk \le r 且 i∣ki\mid k,若 k<lk<l 则无解,枚举下一个 ii。若 k≥lk \ge l 则再特判 min⁡(i,k−i)\min(i,k-i) 是否为 11,是则跳过此 ii,否则输出 ii 与 k−ik-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;
}
}