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

浙公網安備 33010602011771號