首页 > 其他 > 详细

「MCOI-05」魔仙 - 题解

时间:2021-05-04 17:28:30      阅读:20      评论:0      收藏:0      [点我收藏+]

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;
}

「MCOI-05」魔仙 - 题解

原文:https://www.cnblogs.com/SparkleZH-Blog/p/14729689.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!