Codeforces Round #767 (Div. 2) - B
题目翻译
考虑数组 a 由[l,r] 范围内的所有整数组成。例如,如果l=3,r=7,那么a=[3,4,5,6,7]。
给定l、r和k,在最多k次执行以下操作后,gcd(a)是否可能大于1?
- 从 a 中选择 2 个数字。
- 从数组中永久删除其中每一个的匹配项。
- 将他们的产品重新插入 a。
gcd(b)表示 b 中整数的最大公约数(gcd)。
输入
输入的第一行包含一个整数 t(1≤t≤1e5)-测试用例的数量。测试用例的描述如下。
每个测试用例的输入由一行组成,其中包含 3 个非负整数 l、r和k(1≤l≤r≤1e9,0≤k≤r−l) 。
输出
对于每个测试用例,如果可以通过执行最多 k 操作使相应数组的GCD大于1,则打印“YES”,否则打印“NO”(不区分大小写)。
样例
输入
9
1 1 0
3 5 1
13 13 0
4 4 0
3 7 4
4 10 3
2 4 0
1 7 3
1 5 3
输出
NO
NO
YES
YES
YES
YES
NO
NO
YES
解题思路
这道题要推个结论,我们对于一个连续区间取中间任意两个数进行操作,最主要的是他的操作结果还要插回来,所以我们考虑将中间的数分成奇数和偶数,偶数不论怎么操作,只要不是 2 2 求gcd最后的结果都不会是 1,而奇数不一定,此外奇数乘偶数结果依然是偶数,偶数乘偶数结果也是偶数,所以我们只要找到区间有几个奇数就可以知道答案了。
代码示例
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int t;
int l,r,k;
int odd;//奇数
int even;//偶数
int main(){
cin>>t;
while(t--){
odd=even=0;
cin>>l>>r>>k;
if(l==r){
if(l==1) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
else{
if(l%2&&r%2) even=(r-l)/2;
else even=(r-l)/2+1;
if(r-l+1-even<=k) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
return 0;
}