题解 CF1779B MKnez's ConstructiveForces Task

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

题意

本题有多组数据。

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

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

分析

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

{s3+s4++sn=0s1+s4++sn=0s1+s2++sn2=0

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

n 为偶数时

可以代入化简为:s1+s2=0

所以就用最简单的 s1=1,s2=1 即可。

n 为奇数时

可以带入化简为:n2s1+(n21)s2=0

所以直接令 s1=n21,s2=n2

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

注意

n=3 时,根据上面的式子可得 1×s1+0×s2=0,解得 s1=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 @   Chen_Jinhui  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现

一言

我,将某个人,唯一的某个人,试图锁定。我,
——你的名字
点击右上角即可分享
微信分享提示