CF1582D

· · 题解

题意简述

给定数列 a,构造一个数列 b 满足 \sum{a(i)\cdot b(i)} = 0

#### 题目分析 ------------ 一种显而易见的构造方式是让相邻的相邻的两个数互相抵消,就是令 $b(i)=-a(i+1)$,$b(i+1)=a(i)$。由于题设中 $-10^{4} \leq a(i) \leq 10^{4}$,所以与之对应的 $b(i)$ 也会满足 $-10^{4} \leq b(i) \leq 10^{4}$。 假如数列长度为偶数则可以直接按照如上方式构造,若数列长度为奇数则需要找出前 $3$ 个数设为 $a$,$b$,$c$。那么我们只需要找出如下方程的一组可行解就可以完美地解决此题 $a \cdot x+b \cdot y=-c \cdot z

可以发现当 a+b \neq 0 时令 x=y=-c, z=a+b 即可,若 a+b=0,只需要交换 bc就可以满足题设了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 2e5 + 10;
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
    for(; isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+(ch^48);
    return x*f;
}
int n,a[N];
int T,start;
int main(){
    T = read();
    while(T--){
        start = 1;
        n = read();
        for(int i=1;i<=n;i++)
            a[i] = read();
        if(n & 1){
            start = 4;
            if(a[1] + a[2] != 0)
                printf("%d %d %d ",-a[3],-a[3],a[1]+a[2]);
            else if(a[2] + a[3] != 0)
                printf("%d %d %d ",a[2]+a[3],-a[1],-a[1]);
            else printf("%d %d %d ",-a[2],a[1]+a[3],-a[2]);
        }
        for(int i=start;i<=n;i+=2)
            printf("%d %d ",-a[i+1],a[i]);
        printf("\n");
    }
    return 0;
}