「MCOI-05」魔仙

题意

给定一个 \(n\), 构造长度为 \(n\) 的序列,使得和为 0,乘积为 \(n\)

解答

我们考虑 \(n\) 的性质,发现 \(0\) 是一个偶数,如果序列中没有偶数,作为一对奇数乘积的 \(n\) 自然也会是奇数,奇数个奇数整不出来偶数。

所以肯定是有偶数的。

抓着这一点下手,我们继续分析。

如果只有一个偶数,我们的乘积自然成了一个偶数,然而偶数和奇数个奇数同样整不出来偶数。

所以我们有了结论,至少有两个偶数。

也就是 \(n=4k\)

我们根据 \(k\) 的奇偶性分类讨论。

\(k\) 是奇数 \(2*\frac{n}{-1}*(-1)^k*1^{3k-2}\)

\(k\) 是偶数 \((-2)*\frac{n}{-1}*1^{3k}*(-1)^{k-2}\)

这个样子我们就完成了我们的构造了

code↓

#include <bits/stdc++.h>
using namespace std;
int T, n;
int main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin>>T; while(T--){
		cin>>n;
		if(n%4){
			cout<<"w33zAKIOI\n";
			continue;
		}
		int k=n/4;
		if(k%2==1){
			cout<<2<<" "<<n/-2<<" ";
			for(int i=1; i<=k; ++i) cout<<-1<<" ";
			for(int i=1; i<=k*3-2; ++i) cout<<1<<" ";
			cout<<'\n';
		}else{
			cout<<-2<<" "<<n/(-2)<<" ";
			for(int i=1; i<=3*k; ++i) cout<<1<<" ";
			for(int i=1; i<=k-2; ++i) cout<<-1<<" ";
		}
	}
	return 0;
}
posted @ 2025-09-21 15:05  BaiBaiShaFeng  阅读(9)  评论(0)    收藏  举报
Sakana Widget右下角定位