给定一个l,r代表数组中的元素的值是l-r。如:(1,6)[1,2,3,4,5,6],每次操作可以选择两个数从数组中移除,并将二者的乘积置入数组中,问能否在k次操作内使得整个数组的最大公约数大于1.
题解首先从数组全局来考虑,移除两个数并置入它们的乘积,并不会改变这总的因子情况,而改变的是一个将两个数的因子合并成一个新数。为了使整个数组最大公约数大于1,那么数组中每个数都应该有相同的因子。那显然初始数列每个数拥有相同因子最多的数,就是能够用最少次数使得整个数组最大公约数大于1的公约数。容易联想到2这个因子。那么我们只要将没有2这个因子的数与有2这个因子的数相乘即可减去一个不带2因子的数。那么这个问题的答案就是序列中奇数的个数。然而还需要几个特判边界,当l==r时,数组公约数就是其本身.
#includeusing 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(); }



