题解 CF1779B MKnez's ConstructiveForces Task

大家好,我是 CQ-C2024 蒟蒻 CJH。

题意

本题有多组数据。

给定一个正整数 $n$,请你构造一个有 $n$ 个非零整数的序列,满足任意相邻的两个数等于序列中所有数的总和且序列中的每一个数的绝对值不超过 $5000$。

试判断是否存在这样一个序列,如果可以输出 YES 并输出任意一个满足条件的序列,否则输出 NO

分析

由题可得,将每一种情况移项:

$$\begin{cases}s_3+s_4+\dots+s_n=0\\s_1+s_4+\dots+s_n=0\\\dots\\s_1+s_2+\dots+s_{n-2}=0\end{cases}$$

根据加减消元法,可以发现:奇偶性相同的所有数相等。

当 $n$ 为偶数时

可以代入化简为:$s_1+s_2=0$。

所以就用最简单的 $s_1=1,s_2=-1$ 即可。

当 $n$ 为奇数时

可以带入化简为:$\lfloor\dfrac{n}{2}\rfloor s_1+(\lfloor\dfrac{n}{2}\rfloor -1) s_2=0$。

所以直接令 $s_1=\lfloor\dfrac{n}{2}\rfloor -1,s_2=-\lfloor\dfrac{n}{2}\rfloor$。

剩下的根据相等关系处理即可。

注意

当 $n=3$ 时,根据上面的式子可得 $1\times s_1+0 \times s_2=0$,解得 $s_1=0$。

因为是非零整数,所以不满足条件,应该输出 NO

易证其他的情况均有解。

代码

//the code is from chenjh
#include<bits/stdc++.h>
using namespace std;
void solve(){
    int n;scanf("%d",&n);
    if(n==3){puts("NO");return;}//特判 n=3 时。
    puts("YES");//不等于 3 必定有解。
    if(n&1){//按照分析,分类讨论。
        int a=n>>1,b=a-1;//处理 s_1,s_2 的系数。
        for(int i=1;i<n;i+=2) printf("%d %d ",b,-a);
        printf("%d\n",b);
    }
    else{
        for(int i=1;i<=n;i+=2) printf("1 -1 ");
        putchar('\n');
    }
}
int main(){
    int t;scanf("%d",&t);
    while(t--) solve();
    return 0;
}
posted @ 2023-01-05 02:09  Chen_Jinhui  阅读(13)  评论(0)    收藏  举报  来源