一道不错的构造题。
思路
先说一句废话,能被 (4) 整除的数在除以 (2) 之后得到的数还是一个偶数。
我们可以根据 (k) 的奇偶性以及 (k) 除以 (2) 之后的奇偶性分成三种情况来进行讨论。
当 (k) 为奇数时,我们把所有偶数都放在 (b) 的位置上,把所有的奇数都放在 (a) 的位置上,因为奇数 (+) 奇数 (=) 偶数,这样可以保证每个 $(a + k) cdot b $ 都是两个偶数相乘,两个偶数相乘的结果一定可以被 (4) 整除。
当 (k) 为偶数且 (dfrac{k}{2}) 为奇数时,我们把所有能被 (4) 整除的偶数放在 (b) 的位置上,并任找一个奇数放在 (a) 的位置上即可,对于那些不能被 (4) 整除的偶数,我们可以把它放在 (a) 的位置上,把任意一个奇数放在 (b) 的位置上,原因很简单,我们设 (k=2times p),其中 (p) 为一个奇数,设相对的偶数 (a) 为 (a=2times q),其中 (q) 为一个奇数。这时 ((a+k)=2times (p+q))。
因为 (p) 和 (q) 都是奇数,它们的和是一个偶数,两个偶数的积一定可以被 (4) 整除,这时后让 (b) 等于任意一个奇数即可。
当 (k) 为偶数且 (dfrac{k}{2}) 为奇数时,我们把所有能被 (4) 整除的偶数放在 (b) 的位置上,并任找一个奇数放在 (a) 的位置上即可,对于那些不能被 (4) 整除的偶数,我们可以把它放在 (a) 的位置上,把任意一个奇数放在 (b) 的位置上,原因很简单,我们设 (k=2times p),其中 (p) 为一个奇数,设相对的偶数 (a) 为 (a=2times q),其中 (q) 为一个奇数。这时 ((a+k)=2times (p+q))。
当 (k) 为偶数且 (dfrac{k}{2}) 为奇偶数时,类比上面的过程,那些不能被 (4) 整除的偶数没有搭配对象,无论如何都不能被 (4) 整除,此时无解。
代码
#include <bits/stdc++.h>
using namespace std;
int t, n, k;
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &k);
if (k & 1) {
puts("YES");
for (int i = 1; i <= n; i += 2) {
printf("%d %dn", i, i + 1);
}
} else {
if ((k >> 1) & 1) {
puts("YES");
for (int i = 1; i <= n; i += 2) {
if (((i + 1) >> 1) & 1) {
printf("%d %dn", i + 1, i);
} else {
printf("%d %dn", i, i + 1);
}
}
} else {
puts("NO");
}
}
}
return 0;
}