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

浙公网安备 33010602011771号