「MCOI-05」魔仙 - 题解

Description

  • 给定 \(n\),构造一个长度为 \(n\) 的序列,和为 \(0\),积为 \(n\),或者指出无解。
  • \(1 \le n \le 10^6\)\(1 \le \sum{n} \le 5\times10^6\)\(1 \le T \le 10^5\),其中 \(T\) 为数据组数。

Solution

首先判断无解,容易发现 \(n\bmod 4 = 0\),证明如下:

如果 \(n\) 为奇数,则序列中所有数皆为奇数,于是和为奇数,矛盾,故 \(n\bmod 2 = 0\)

\(n = 2k\),易知序列中至少有 \(1\) 个偶数,设其为 \(2p\)

假如剩余的 \(2k-1\) 个数都是奇数,那么和为 \(2k-1\) 个奇数加 \(2p\),为奇数,矛盾,故至少有 \(2\) 个偶数。

\(\therefore n\bmod 4 = 0\)

接着考虑构造,我们发现可以巧用 \(1, -1\) 来抵消。

\(q\) = \(\frac{n}{4}\)

  • \(q \bmod 2 = 0\)

    • \(-2, -2q\) 来凑 \(n\)
    • \(3q\)\(1\)\(q-2\)\(-1\) 来抵消。
  • \(q \bmod 2 = 1\)

    • \(2, -2q\) 来凑 \(-n\)
    • \(3q-2\)\(1\)\(q\)\(-1\) 来抵消。

Code

#include <bits/stdc++.h>
using namespace std;

int T, n, k;

int main() {
	scanf("%d", &T);
	while (T--) {
		scanf("%d", &n);
		if (n%4 != 0) {
			printf("w33zAKIOI\n");
			continue;
		}
		
		k = n/4;
		
		if (k & 1) {
			printf("2 -%d ", k*2);
			for (int i = 1; i <= 3*k-2; i++)
				printf("1 ");
			for (int i = 1; i <= k; i++)
				printf("-1 ");
			printf("\n");
		} else {
			printf("-2 -%d ", k*2);
			for (int i = 1; i <= 3*k; i++)
				printf("1 ");
			for (int i = 1; i <= k-2; i++)
				printf("-1 ");
			printf("\n");
		}
	}
	
	return 0;
}
posted @ 2021-05-04 16:36  Sparkle_ZH  阅读(154)  评论(0)    收藏  举报