Codeforces Round#767(Div.2) B. GCD Arrays

题意

给定一个l,r代表数组中的元素的值是l-r。如:(1,6)[1,2,3,4,5,6],每次操作可以选择两个数从数组中移除,并将二者的乘积置入数组中,问能否在k次操作内使得整个数组的最大公约数大于1.

题解

首先从数组全局来考虑,移除两个数并置入它们的乘积,并不会改变这总的因子情况,而改变的是一个将两个数的因子合并成一个新数。为了使整个数组最大公约数大于1,那么数组中每个数都应该有相同的因子。那显然初始数列每个数拥有相同因子最多的数,就是能够用最少次数使得整个数组最大公约数大于1的公约数。容易联想到2这个因子。那么我们只要将没有2这个因子的数与有2这个因子的数相乘即可减去一个不带2因子的数。那么这个问题的答案就是序列中奇数的个数。然而还需要几个特判边界,当l==r时,数组公约数就是其本身.

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
const int N = 1e5 + 10;
ll a[N],b[N],st[105];
void solve()
{
	int l,r,k; cin >> l>>r>>k;
	int cnt = 0;
	if (l == r&&l!=1)
	{
		cout << "YES" << endl;
		return;
	}
	
	if (l == r && l == 1)
	{
		cout << "NO" << endl;
		return;
	}	
	if (l % 2 ==0)l++;
	if (r % 2 == 1)r--,cnt++;
	if (k < (r - l + 1) / 2+cnt)cout << "NO" << endl;
	else cout << "YES" << endl;
}
int main()
{
	int t;
	cin >> t;
	while (t--)solve();
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值