Date:2022.01.14
题意:给定序列
a
a
a,要求构造出一个序列
b
b
b使得
∑
i
=
1
n
a
i
⋅
b
i
=
=
0
\sum_{i=1}^{n}a_i · b_i==0
∑i=1nai⋅bi==0,其中
a
、
b
a、b
a、b中均不存在0。
思路:两两一组,最后如果是奇数则剩三个组成一组,让其中一个等于另外两个的和,另一个等于负的除去两个的另外一个。但是除此之外可能存在一种情况,即两个相加==0,则照常算
b
b
b中会出现0,那我们就找和不为0的两项组为一项,另一项满足定义一定不为0。但是有没有一种情况
a
、
b
、
c
a、b、c
a、b、c都为0?我们不妨分析一下最后三项会不会存在三项两两相加全得0的情况,难不成这样就没法组合了?
①
a
+
b
=
0
有
a
=
−
b
a+b=0 有 a=-b
a+b=0有a=−b:
②
a
+
c
=
0
有
a
=
−
c
,
b
=
c
a+c=0 有 a=-c,b=c
a+c=0有a=−c,b=c
③
b
+
c
=
0
有
b
=
−
c
,
因
此
一
定
有
b
=
=
0
∧
c
=
=
0
∧
a
=
=
0
b+c=0 有 b=-c,因此一定有b==0 \wedge c==0 \wedge a==0
b+c=0有b=−c,因此一定有b==0∧c==0∧a==0
由上若①、②、③都为0,则
a
=
=
b
=
=
c
=
=
0
a==b==c==0
a==b==c==0一定存在。
代码如下:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N = 1e6+10;
typedef long long LL;
LL n,m,t,k;
LL a[N],b[N];
int main()
{
cin>>t;
while(t--)
{
LL x=0;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
if(n%2) x=3;
for(int i=2;i<=n-x;i+=2)
{b[i]=-a[i-1];b[i-1]=a[i];}
LL p=n-2,q=n-1,r=n;
if(x==3)
{
if(a[p]+a[q]!=0) {b[p]=b[q]=-a[r];b[r]=a[q]+a[p];}
else if(a[p]+a[r]!=0) {b[p]=b[r]=-a[q];b[q]=a[p]+a[r];}
else if(a[q]+a[r]!=0) {b[q]=b[r]=-a[p];b[p]=a[q]+a[r];}
}
for(int i=1;i<=n;i++) cout<<b[i]<<' ';
cout<<endl;
}
return 0;
}