• 欢迎光临~

CF1719B Mathematical Circus 题解

开发技术 开发技术 2022-08-17 次浏览

一道不错的构造题。

思路

先说一句废话,能被 (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;
}

程序员灯塔
转载请注明原文链接:CF1719B Mathematical Circus 题解
喜欢 (0)