首页 > 其他 > 详细

P7567 「MCOI-05」魔仙

时间:2021-09-12 05:27:19      阅读:26      评论:0      收藏:0      [点我收藏+]

手玩发现只有 \(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」魔仙

原文:https://www.cnblogs.com/kkksc0100/p/moxian.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!