一道不错的构造题。
思路
先说一句废话,能被 \(4\) 整除的数在除以 \(2\) 之后得到的数还是一个偶数。
我们可以根据 \(k\) 的奇偶性以及 \(k\) 除以 \(2\) 之后的奇偶性分成三种情况来进行讨论。
当 \(k\) 为奇数时,我们把所有偶数都放在 \(b\) 的位置上,把所有的奇数都放在 \(a\) 的位置上,因为奇数 \(+\) 奇数 \(=\) 偶数,这样可以保证每个 $(a + k) \cdot b $ 都是两个偶数相乘,两个偶数相乘的结果一定可以被 \(4\) 整除。
当 \(k\) 为偶数且 \(\dfrac{k}{2}\) 为奇数时,我们把所有能被 \(4\) 整除的偶数放在 \(b\) 的位置上,并任找一个奇数放在 \(a\) 的位置上即可,对于那些不能被 \(4\) 整除的偶数,我们可以把它放在 \(a\) 的位置上,把任意一个奇数放在 \(b\) 的位置上,原因很简单,我们设 \(k=2\times p\),其中 \(p\) 为一个奇数,设相对的偶数 \(a\) 为 \(a=2\times q\),其中 \(q\) 为一个奇数。这时 \((a+k)=2\times (p+q)\)。
因为 \(p\) 和 \(q\) 都是奇数,它们的和是一个偶数,两个偶数的积一定可以被 \(4\) 整除,这时后让 \(b\) 等于任意一个奇数即可。
当 \(k\) 为偶数且 \(\dfrac{k}{2}\) 为奇数时,我们把所有能被 \(4\) 整除的偶数放在 \(b\) 的位置上,并任找一个奇数放在 \(a\) 的位置上即可,对于那些不能被 \(4\) 整除的偶数,我们可以把它放在 \(a\) 的位置上,把任意一个奇数放在 \(b\) 的位置上,原因很简单,我们设 \(k=2\times p\),其中 \(p\) 为一个奇数,设相对的偶数 \(a\) 为 \(a=2\times q\),其中 \(q\) 为一个奇数。这时 \((a+k)=2\times (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 %d\n", 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 %d\n", i + 1, i);
} else {
printf("%d %d\n", i, i + 1);
}
}
} else {
puts("NO");
}
}
}
return 0;
}
标签:Mathematical,放在,位置,奇数,题解,Circus,times,偶数,整除
From: https://www.cnblogs.com/Dregen-Yor/p/16596323.html