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.*;
  import java.math.BigInteger;
  import java.util.*;
  import static java.lang.Math.PI;
  import static java.lang.System.in;
  import static java.lang.System.out;
  import static java.lang.System.err;
  /*
  -1 1 
  11 19 11 19 11 
  1 1 1 1 1 1 -3 
  */
  public class D {    
  
      static long LCM(long a, long b) {
          long gcd = Foster.gcd(a, b);
          return (a*b)/gcd;
      }
  
      static long[] forOdd(long a[], int n) {
          long sumNeg = 0, sumPos = 0;
          boolean hasPos = false, hasNeg = false;
          for(long i : a) {
              if(i < 0) {
                  sumNeg += Math.abs(i);
                  hasNeg = true;
              }
              else {
                  sumPos += i;
                  hasPos = true;
              }
          }
          if(!hasNeg) {
              int idx = biggestIdx(a);
              sumNeg = Math.abs(a[idx]);
              sumPos -= Math.abs(a[idx]);
              long lcm = LCM(sumNeg, sumPos);
              long b[] = new long[n];
              for(int i = 0; i < n; i++) {
                  if(i==idx) {
                      b[i] = - (lcm/sumNeg);
                  } else {
                      b[i] = lcm/sumPos;
                  }
              }
              return b;
          }
          if(!hasPos) {
              int idx = biggestIdx(a);
              sumPos = Math.abs(a[idx]);
              sumNeg -= Math.abs(a[idx]);
              long lcm = LCM(sumNeg, sumPos);
              long b[] = new long[n];
              for(int i = 0; i < n; i++) {
                  if(i==idx) {
                      b[i] = -(lcm/sumPos);
                  } else {
                      b[i] = lcm/sumNeg;
                  }
              }
              return b;
          }
          
          long sum = 0;
          for(long i : a) sum += i;
          int idx = biggestIdx(a);
          sumNeg = Math.abs(a[idx]);
          sumPos = Math.abs(sum-a[idx]);
          if(sumPos==0) {
              idx = biggestIdx(a);
              sumNeg = Math.abs(a[idx]);
              sumPos = Math.abs(sum-a[idx]);
          }
              
          if(sumPos==0) {
              sumNeg = 0;
              sumPos = 0;
              for(long i : a) {
                  if(i < 0)   sumNeg += Math.abs(i);
                  else    sumPos += i;
              }
              long lcm = LCM(sumNeg, sumPos);
              long b[] = new long[n];
              for(int i = 0; i < n; i++) {
                  if(a[i] < 0) {
                      b[i] = lcm/sumNeg;
                  } else {
                      b[i] = lcm/sumPos;
                  }
              }
              return b;
  
          } else {
              long b[] = solveForBoth(sumNeg, sumPos, a, n, idx, sum);
              return b;
          }         
      }
      static long[] solveForBoth(long sumNeg, long sumPos, long []a, int n, int idx, long sum) {
          
          long lcm = LCM(sumNeg, sumPos);
          long b[] = new long[n];
          for(int i = 0; i < n; i++) {
              if(i==idx) {
                  if(a[idx] < 0 && sum-a[idx] < 0) {
                      b[i] = -(lcm/sumNeg);
                  }
                  else if(a[idx] > 0 && sum-a[idx] > 0) {
                      b[i] = -(lcm/sumNeg);
                  } else {
                      b[i] = (lcm/sumNeg);
                  }
              } else {
                  b[i] = lcm/sumPos;
              }
          }
   
          return b;
      }
  
      public static void main(String[] args) throws Exception {   
          Foster sc = new Foster();
          PrintWriter p = new PrintWriter(out);
  
         /*
          * Is that extra condition needed
          * Check overflow in pow function or in general
          * Check indices of read array functions
          * Think of an easier solution because the problems you solve are always easy
          * Check the iterator of loop
          */   
  
          int t = sc.nextInt();
          while(t--!=0) {
              int n = sc.nextInt();
              long a[] = sc.longArray(n);
              long b[] = new long[n];
              if(n%2==0) {
                  for(int i = 0; i < n; i++) {
                      if(i%2==0) {
                          b[i] = -a[i+1];
                      } else {
                          b[i] = a[i-1];
                      }
                  }
              }
              else {
                  long copyA[] = Arrays.copyOf(a, 3);
                  long tempB[] = forOdd(copyA, 3);
                  b[0] = tempB[0];    b[1] = tempB[1];    b[2] = tempB[2];
                  for(int i = 3; i < n; i++) {
                      if(i%2!=0) {
                          b[i] = -a[i+1];
                      } else {
                          b[i] = a[i-1];
                      }
                  }
              }
  
              // go(a, b);
              for(int i = 0; i < a.length; i++) {
                  p.print(b[i] + " ");
              }
              p.println();
          }
          p.close();
      }
      
  
      static void go(long a[], long b[]) {
          long sum = 0;
          for(int i = 0; i < a.length; i++) {
              sum += (a[i] * b[i]);
          }
          out.println("final = " + sum);
      }
  
      static int biggestIdx(long a[]) {
          long min = Integer.MAX_VALUE;
          int idx = -1;
          for(int i = 0; i < a.length; i++) {
              if(Math.abs(a[i]) < min) {
                  min = Math.abs(a[i]);
                  idx = i;
              }
          }
          return idx;
      }
  
      static long[] sort(long a[]) {
          ArrayList<Long> arr = new ArrayList<>();
          for(long i : a) {
              arr.add(i);
          }
          Collections.sort(arr);
          for(int i = 0; i < arr.size(); i++) {
              a[i] = arr.get(i);
          }
          return a;
      }
      static int[] sort(int a[]) {
          ArrayList<Integer> arr = new ArrayList<>();
          for(int i : a){
              arr.add(i);
          }
          Collections.sort(arr);
          // Collections.reverse(arr);
          for(int i = 0; i < arr.size(); i++){
              a[i] = arr.get(i);
          }
          return a;
      }   
  
      static class Foster {
          BufferedReader br = new BufferedReader(new InputStreamReader(in));
          StringTokenizer st = new StringTokenizer("");
          String next() {
              while (!st.hasMoreTokens())
                  try {
                      st = new StringTokenizer(br.readLine());
                  } 
                  catch (IOException e) {
                      e.printStackTrace();
                  }
              return st.nextToken();
          }
          int nextInt() {
              return Integer.parseInt(next());
          }
          long nextLong() {
              return Long.parseLong(next());
          }
          double nextDouble() {
              return Double.parseDouble(next());
          }
          int[] intArray(int n) {
              int arr[] = new int[n];
              for(int i = 0; i < n; i++) {
                  arr[i] = nextInt();
              }
              return arr;
          }
          long[] longArray(int n) {
              long arr[] = new long[n];
              for(int i = 0; i < n; i++) {
                  arr[i] = nextLong();
              }
              return arr;
          }
          static long pow(long... a) {
              long mod = Long.MAX_VALUE;
              if(a.length == 3)   mod = a[2];
              long res = 1;
              while(a[1] > 0) {
                  if((a[1] & 1) == 1)
                      res = (res * a[0]) % mod;
                  a[1] /= 2;
                  a[0] = (a[0] * a[0]) % mod;
              }
              return res;
          }
          static long gcd(long a, long b) {
              if (b == 0)
                  return a;
              return gcd(b, a % b);
          }
      }
  }