手玩发现只有 \(4,8,12...\) 行。
只有 \(n \bmod 4=0\) 的时候才可以。
证明略。
考虑构造。
肯定能会有一堆 \(1\) 或 \(-1\)。
设 \(n=4p\)。
极端情况,\(p\) 事不可分的。(例如 \(8\))
考虑分 \(4\)。
\(4=2\times 2\)
来试试 \(2 2 p\)
此时需要 \(p+4\) 抵消的 \(-1\)。
如果 \(p\bmod 2=0\) 那么 \(-1\) 乘起来为 \(1\)。接下来必须 \(1,-1\) 个数相等,以保证和。
然而只剩下奇数个了。所以不可取。
\(p\bmod 2=1\) 同理。
试试 \(-2 2p\)。
花 \(2p-2\) 个 \(-1\) 就行了。乘起来也是 \(1\)。
此时还有 \(2p\) 个数。珂以交叉地分配 \(1\)、\(-1\)。
但是如果 \(p\bmod 2=0\),那么他们乘起来为 \(1\)。不能抵消那个负号。
这个怎么解决?
很简单,用 \(2\),\(2p\) 即可。剩下的使用 \(2p+2\) 个 \(-11\),然后交叉分配即可。很明显这样珂以符合。
代码略。
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--){
int n;
cin>>n;
if(n%4!=0)cout<<"w33zAKIOI"<<endl;
else{
int k=n/4;
if(k&1){
cout<<2<<" "<<-2*k<<" ";
for(int i=1;i<=3*k-2;i++)cout<<1<<" ";//1珂以放到一起写
for(int i=1;i<=k;i++)cout<<-1<<" ";
}else{
cout<<-2<<" "<<-2*k<<" ";
for(int i=1;i<=3*k;i++)cout<<1<<" ";
for(int i=1;i<=k-2;i++)cout<<-1<<" ";
}
cout<<endl;
}
}
return 0;
}