P7567 「MCOI-05」魔仙

手玩发现只有 \(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;
}

P7567 「MCOI-05」魔仙

上一篇:Flink流处理


下一篇:【ubuntu 18.04】安装apache2+php7+phabricator环境