分类讨论思想。
Description
把 \(1\) 到 \(n\) 共 \(n\) 个整数分成 \(\frac{n}{2}\) 对有序数对 \(\left(a_i, b_i\right)\),则对于 \(\forall \left(a_i, b_i\right), 4\mid(a_i+k)\times b_i\)。问合法方案是否存在,若存在给出一组合法方案。
Analysis
既然是与被 \(4\) 整除有关,那么我们可以对 \(4\) 这个数进行分析。
\[4=4\times 1=1\times 4=2\times 2 \]即三种情况,简记为:\(p\times 4q\),\(4p\times q\),\(2p\times 2q\)。
显然可以使所有 \(x\left(4\mid x,x\in \left[1,n\right],x\in\mathbb{Z}\right)\) 尽量放在 \(b\) 的位置,\(a\) 选择奇数,此时方案一定最优,共能匹配 \(\frac{n}{2}\) 个数字。也就是说还剩 \(\frac{n}{2}\) 没有完成匹配,其中有一半奇数,一半偶数(\(4x+2\) 型)。
对于剩余的 \(\frac{n}{2}\) 个数,我们考虑通过 \(a+k\) 或 \(b\) 与 \(a+k\) 配合使被 \(4\) 整除,此时我们需要对 \(k\) 的性质进行讨论。
- \(4\mid k\),加 \(k\) 之后对 \(\left(a+k\right)\times b\pmod4\) 无任何影响,即一定无法匹配;
- \(k\equiv2\pmod4\):使 \(b\) 为偶数即 \(a\equiv2\pmod4\),此时 \(4\mid \left(a+k\right)\);
- \(k\equiv1\pmod4\) 或 \(k\equiv3\pmod4\),使 \(a\) 为奇数,\(b\) 为偶数,一定可以配成偶数 \(\times\) 偶数 的形式,此时可被 \(4\) 整除。
Code
代码细节较多。具体解释见注释。
#include <stdio.h>
int n, k;
int main(void) {
int t; for (scanf("%d", &t); t--; ) {
scanf("%d %d", &n, &k); //读入
if (k % 4 == 0) puts("NO"); //NO 情况特判
else {
puts("YES");
if (k & 1) { //k%4==2,使a%4==2
for (int i = 1; i <= n; i += 2)
printf("%d %d\n", i, i + 1);
}
else { //k 为奇数,使 a 为奇,b 为偶
for (int i = 3; i <= n; i += 4)
printf("%d %d\n", i, i + 1);
for (int i = 2; i <= n; i += 4)
printf("%d %d\n", i, i - 1);
putchar('\n');
}
}
}
return 0;
}
The end. Thanks.
(一键三连