description: Vupsen and Pupsen were gifted an integer array. Since Vupsen doesn't like the number 0, he threw away all numbers equal to 0 from the array. As a result, he got an array a of length n.
  
  Pupsen, on the contrary, likes the number 0 and he got upset when he saw the array without zeroes. To cheer Pupsen up, Vupsen decided to come up with another array b of length n such that ∑_{i=1}^{n}a_i ⋅ b_i=0. Since Vupsen doesn't like number 0, the array b must not contain numbers equal to 0. Also, the numbers in that array must not be huge, so the sum of their absolute values cannot exceed 10^9. Please help Vupsen to find any such array b!
  
  Input
  
  The first line contains a single integer t (1 ≤ t ≤ 100) — the number of test cases. The next 2 ⋅ t lines contain the description of test cases. The description of each test case consists of two lines.
  
  The first line of each test case contains a single integer n (2 ≤ n ≤ 10^5) — the length of the array.
  
  The second line contains n integers a_1, a_2, …, a_n (-10^4 ≤ a_i ≤ 10^4, a_i ≠ 0) — the elements of the array a.
  
  It is guaranteed that the sum of n over all test cases does not exceed 2 ⋅ 10^5.
  
  Output
  
  For each test case print n integers b_1, b_2, …, b_n — elements of the array b (|b_1|+|b_2|+… +|b_n| ≤ 10^9, b_i ≠ 0, ∑_{i=1}^{n}a_i ⋅ b_i=0).
  
  It can be shown that the answer always exists.
  
  Example
  
  Input
  
  
  3
  2
  5 5
  5
  5 -2 10 -9 4
  7
  1 2 3 4 5 6 7
  
  
  Output
  
  
  1 -1
  -1 5 1 -1 -1
  -10 2 2 -3 5 -1 -1
  
  Note
  
  In the first test case, 5 ⋅ 1 + 5 ⋅ (-1)=5-5=0. You could also print 3 -3, for example, since 5 ⋅ 3 + 5 ⋅ (-3)=15-15=0
  
  In the second test case, 5 ⋅ (-1) + (-2) ⋅ 5 + 10 ⋅ 1 + (-9) ⋅ (-1) + 4 ⋅ (-1)=-5-10+10+9-4=0.
solution: import java.io.BufferedReader;
  import java.io.InputStreamReader;
  import java.util.StringTokenizer;
  import java.util.*;
  import java.io.*;
  public class Main {
      // Graph
      // prefix sums
      //inputs
      public static void main(String args[])throws Exception{
          Input sc=new Input();
          precalculates p=new precalculates();
          StringBuilder sb=new StringBuilder();
          int t=sc.readInt();
          for(int f=0;f<t;f++){
              int n=sc.readInt();
              long a[]=sc.readArrayLong();
              if(n%2==0){
                  for(int i=0;i<n;i+=2){
                      long v1=a[i];
                      long v2=a[i+1];
                      long mul=v1*v2;
                      if(mul>0){
                          sb.append((-(v2)+" "+(v1)+" "));
                      }else {
                          if(v1<0)
                              sb.append(v2+" "+-v1 +" ");
                          else
                              sb.append(-v2+" "+v1+" ");
                      }
                  }
              }else{
                  for(int i=0;i<n-3;i+=2){
                      long v1=a[i];
                      long v2=a[i+1];
                      long mul=v1*v2;
                      if(mul>0){
                          sb.append((-(v2)+" "+(v1)+" "));
                      }else {
                          mul = Math.abs(mul);
                          if(v1<0)
                          sb.append(v2+" "+-v1 +" ");
                          else
                              sb.append(-v2+" "+v1+" ");
                      }
                  }
                  long v1=a[n-3];
                  long v2=a[n-2];
                  long v3=a[n-1];
                  long mul=v1*v2*v3;
                  if(mul>0){
                      sb.append(v3*(v1/Math.abs(v1))+" "+v3*(v2/Math.abs(v2))+" "+(-(Math.abs(v1)+Math.abs(v2))));
                  }else{
                      mul=Math.abs(mul);
                      sb.append(v3*(v1/Math.abs(v1))+" "+v3*(v2/Math.abs(v2))+" "+(-(Math.abs(v1)+Math.abs(v2))));
  //                    if(v1<0 && v2+v3>0) {
  //                        v1=-v1;
  //                        sb.append(((-2 * mul / v1)) + " " + (-mul / v2) + " " + (-(mul) / v3));
  //                    }
  //                    else if(v2<0 && v1+v3>0) {
  //                        v2=-v2;
  //                        sb.append(((-mul / v1)) + " " + (-((2 * mul) / v2)) + " " + (-(mul) / v3));
  //                    }
  //                    else if(v3<0 && v2+v1>0){
  //                        v3=-v3;
  //                        sb.append(((-mul/v1))+" "+(-mul/v2)+" "+(-(2*mul)/v3));}
  //
  //                    else{
  //                        v1=-v1;
  //                        v2=-v2;
  //                        v3=-v3;
  //                            sb.append(((-2*mul/v1))+" "+(mul/v2)+" "+((mul)/v3));
  //                    }
                  }
              }// 19 13 6
              // 10 -9  4
  
              // 99990000
              sb.append("\n");
  
          }
          System.out.print(sb);
      }
  }
  class Input{
      BufferedReader br;
      StringTokenizer st;
      Input(){
          br=new BufferedReader(new InputStreamReader(System.in));
          st=new StringTokenizer("");
      }
      public int[] readArray() throws Exception{
          st=new StringTokenizer(br.readLine());
          int a[]=new int[st.countTokens()];
          for(int i=0;i<a.length;i++){
              a[i]=Integer.parseInt(st.nextToken());
          }
          return a;
      }
      public long[] readArrayLong() throws Exception{
          st=new StringTokenizer(br.readLine());
          long a[]=new long[st.countTokens()];
          for(int i=0;i<a.length;i++){
              a[i]=Long.parseLong(st.nextToken());
          }
          return a;
      }
      public int readInt() throws Exception{
          st=new StringTokenizer(br.readLine());
          return Integer.parseInt(st.nextToken());
      }
      public long readLong() throws Exception{
          st=new StringTokenizer(br.readLine());
          return Long.parseLong(st.nextToken());
      }
      public String readString() throws Exception{
          return br.readLine();
      }
      public int[][] read2dArray(int n,int m)throws Exception{
          int a[][]=new int[n][m];
          for(int i=0;i<n;i++){
              st=new StringTokenizer(br.readLine());
              for(int j=0;j<m;j++){
                  a[i][j]=Integer.parseInt(st.nextToken());
              }
          }
          return a;
      }
  }
  class precalculates{
      public int[] prefixSumOneDimentional(int a[]){
          int n=a.length;
          int dp[]=new int[n];
          for(int i=0;i<n;i++){
              if(i==0)
                  dp[i]=a[i];
              else
                  dp[i]=dp[i-1]+a[i];
          }
          return dp;
      }
      public int[] postSumOneDimentional(int a[]) {
          int n = a.length;
          int dp[] = new int[n];
          for (int i = n - 1; i >= 0; i--) {
              if (i == n - 1)
                  dp[i] = a[i];
              else
                  dp[i] = dp[i + 1] + a[i];
          }
          return dp;
      }
      public int[][] prefixSum2d(int a[][]){
          int n=a.length;int m=a[0].length;
          int dp[][]=new int[n+1][m+1];
          for(int i=1;i<=n;i++){
              for(int j=1;j<=m;j++){
                  dp[i][j]=a[i-1][j-1]+dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];
              }
          }
          return dp;
      }
      public long pow(long a,long b){
          long mod=1000000007;
          long ans=0;
          if(b<=0)
              return 1;
          if(b%2==0){
              ans=pow(a,b/2)%mod;
              return ((ans%mod)*(ans%mod))%mod;
          }else{
              return ((a%mod)*(ans%mod))%mod;
          }
      }
  
  }
  class GraphInteger{
      HashMap<Integer,vertex> vtces;
      class vertex{
          HashMap<Integer,Integer> children;
          public vertex(){
              children=new HashMap<>();
          }
      }
      public GraphInteger(){
          vtces=new HashMap<>();
      }
      public void addVertex(int a){
          vtces.put(a,new vertex());
      }
      public void addEdge(int a,int b,int cost){
          if(!vtces.containsKey(a)){
              vtces.put(a,new vertex());
          }
          if(!vtces.containsKey(b)){
              vtces.put(b,new vertex());
          }
          vtces.get(a).children.put(b,cost);
  //        vtces.get(b).children.put(a,cost);
      }
      public boolean isCyclicDirected(){
          boolean isdone[]=new boolean[vtces.size()+1];
          boolean check[]=new boolean[vtces.size()+1];
          for(int i=1;i<=vtces.size();i++) {
              if (!isdone[i] && isCyclicDirected(i,isdone, check)) {
                  return true;
              }
          }
          return false;
      }
      private boolean isCyclicDirected(int i,boolean isdone[],boolean check[]){
          if(check[i])
              return true;
          if(isdone[i])
              return false;
          check[i]=true;
          isdone[i]=true;
          Set<Integer> set=vtces.get(i).children.keySet();
          for(Integer ii:set){
              if(isCyclicDirected(ii,isdone,check))
                  return true;
          }
          check[i]=false;
          return false;
      }
  }
  
  
  
  
  