其他分享
首页 > 其他分享> > CF1719B Mathematical Circus 题解

CF1719B Mathematical Circus 题解

作者:互联网

一道不错的构造题。

思路

先说一句废话,能被 \(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,偶数,整除
来源: https://www.cnblogs.com/Dregen-Yor/p/16596323.html