每天一道英文题,ICPC不自闭(27)

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值