Date:2022.01.14
题意:给定序列aaa,要求构造出一个序列bbb使得∑i=1nai⋅bi==0\sum_{i=1}^{n}a_i · b_i==0∑i=1nai⋅bi==0,其中a、ba、ba、b中均不存在0。

思路:两两一组,最后如果是奇数则剩三个组成一组,让其中一个等于另外两个的和,另一个等于负的除去两个的另外一个。但是除此之外可能存在一种情况,即两个相加==0,则照常算bbb中会出现0,那我们就找和不为0的两项组为一项,另一项满足定义一定不为0。但是有没有一种情况a、b、ca、b、ca、b、c都为0?我们不妨分析一下最后三项会不会存在三项两两相加全得0的情况,难不成这样就没法组合了?
①a+b=0有a=−ba+b=0 有 a=-ba+b=0有a=−b:
②a+c=0有a=−c,b=ca+c=0 有 a=-c,b=ca+c=0有a=−c,b=c
③b+c=0有b=−c,因此一定有b==0∧c==0∧a==0b+c=0 有 b=-c,因此一定有b==0 \wedge c==0 \wedge a==0b+c=0有b=−c,因此一定有b==0∧c==0∧a==0
由上若①、②、③都为0,则a==b==c==0a==b==c==0a==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;
}
本文介绍了一种构造序列的算法,旨在给定序列aaa的基础上构造出序列bbb,满足∑i=1nai⋅bi==0的条件,同时确保a、b序列中不存在0元素。通过两两配对或特殊组合的方法实现这一目标。
272

被折叠的 条评论
为什么被折叠?



