题意
给定一个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();
}