栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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
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();
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/717411.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号