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.util.*;
  import java.io.*;
  import java.math.*;
  import java.lang.*;
  
  public class VupsenPupsenandZero {
      
      // static int mod = 998244353;
      static int mod = 1000000007;
  
      public static class Reader {
          final private int BUFFER_SIZE = 1 << 16;
          private DataInputStream din;
          private byte[] buffer;
          private int bufferPointer, bytesRead;
   
          public Reader()
          {
              din = new DataInputStream(System.in);
              buffer = new byte[BUFFER_SIZE];
              bufferPointer = bytesRead = 0;
          }
   
          public Reader(String file_name) throws IOException
          {
              din = new DataInputStream(
                  new FileInputStream(file_name));
              buffer = new byte[BUFFER_SIZE];
              bufferPointer = bytesRead = 0;
          }
   
          public String readLine() throws IOException
          {
              byte[] buf = new byte[64]; // line length
              int cnt = 0, c;
              while ((c = read()) != -1) {
                  if (c == '\n') {
                      if (cnt != 0) {
                          break;
                      }
                      else {
                          continue;
                      }
                  }
                  buf[cnt++] = (byte)c;
              }
              return new String(buf, 0, cnt);
          }
   
          public int nextInt() throws IOException
          {
              int ret = 0;
              byte c = read();
              while (c <= ' ') {
                  c = read();
              }
              boolean neg = (c == '-');
              if (neg)
                  c = read();
              do {
                  ret = ret * 10 + c - '0';
              } while ((c = read()) >= '0' && c <= '9');
   
              if (neg)
                  return -ret;
              return ret;
          }
   
          public long nextLong() throws IOException
          {
              long ret = 0;
              byte c = read();
              while (c <= ' ')
                  c = read();
              boolean neg = (c == '-');
              if (neg)
                  c = read();
              do {
                  ret = ret * 10 + c - '0';
              } while ((c = read()) >= '0' && c <= '9');
              if (neg)
                  return -ret;
              return ret;
          }
   
          public double nextDouble() throws IOException
          {
              double ret = 0, div = 1;
              byte c = read();
              while (c <= ' ')
                  c = read();
              boolean neg = (c == '-');
              if (neg)
                  c = read();
   
              do {
                  ret = ret * 10 + c - '0';
              } while ((c = read()) >= '0' && c <= '9');
   
              if (c == '.') {
                  while ((c = read()) >= '0' && c <= '9') {
                      ret += (c - '0') / (div *= 10);
                  }
              }
   
              if (neg)
                  return -ret;
              return ret;
          }
   
          private void fillBuffer() throws IOException
          {
              bytesRead = din.read(buffer, bufferPointer = 0,
                                   BUFFER_SIZE);
              if (bytesRead == -1)
                  buffer[0] = -1;
          }
   
          private byte read() throws IOException
          {
              if (bufferPointer == bytesRead)
                  fillBuffer();
              return buffer[bufferPointer++];
          }
   
          public void close() throws IOException
          {
              if (din == null)
                  return;
              din.close();
          }
      }
  
      public static void main(String[] args) throws Exception {
          Reader scn = new Reader();
          PrintWriter pw = new PrintWriter(System.out);
          int t = scn.nextInt();
          outer : while(t-->0){
              int n = scn.nextInt();
              int[] arr = new int[n];
              for(int i=0; i<n; i++){
              	arr[i] = scn.nextInt();
              }
              int[] b = new int[n];
              if(n % 2 == 0){
              	for(int i=0; i<n; i+=2){
              		b[i+1] = arr[i];
              		b[i] = (arr[i+1] * -1);
              	}
              }else{
              	for(int i=0; i<n-3; i+=2){
              		b[i+1] = arr[i];
              		b[i] = (arr[i+1] * -1);
              	}
              	if((arr[n-3] > 0 && arr[n-2] > 0) || (arr[n-3] < 0 && arr[n-2] < 0)){
              		b[n-3] = (-1 * arr[n-1]);
              		b[n-2] = (-1 * arr[n-1]);
              		b[n-1] = (arr[n-3] + arr[n-2]);
              	}else if((arr[n-3] > 0 && arr[n-1] > 0) || (arr[n-3] < 0 && arr[n-1] < 0)){
              		b[n-3] = (-1 * arr[n-2]);
              		b[n-1] = (-1 * arr[n-2]);
              		b[n-2] = arr[n-1] + arr[n-3];
              	}else if((arr[n-1] > 0 && arr[n-2] > 0) || (arr[n-1] < 0 && arr[n-2] < 0)){
              		b[n-3] = arr[n-2] + arr[n-1];
              		b[n-2] = (-1 * arr[n-3]);
              		b[n-1] = (-1 * arr[n-3]);
              	}
              }
              for(int val : b){
              	pw.print(val + " ");
              }
              pw.println();
          }
          pw.close();
      }
  
      public static class Pair{
          int x;
          int y;
  
          Pair(int x, int y){
              this.x = x;
              this.y = y;
          }
      }
  
      private static void sort(int[] arr) {
          List<Integer> list = new ArrayList<>();
          for (int i=0; i<arr.length; i++){
              list.add(arr[i]);
          }
          Collections.sort(list); // collections.sort uses nlogn in backend
          for (int i = 0; i < arr.length; i++){
              arr[i] = list.get(i);
          }
      }
  
      private static void sort(long[] arr) {
          List<Long> list = new ArrayList<>();
          for(int i=0; i<arr.length; i++){
              list.add(arr[i]);
          }
          Collections.sort(list); // collections.sort uses nlogn in backend
          for (int i = 0; i < arr.length; i++){
              arr[i] = list.get(i);
          }
      }
  
      // private static void sort(Pair[] arr) {
      //     List<Pair> list = new ArrayList<>();
      //     for(int i=0; i<arr.length; i++){
      //         list.add(arr[i]);
      //     }
      //     Collections.sort(list); // collections.sort uses nlogn in backend
      //     for (int i = 0; i < arr.length; i++){
      //         arr[i] = list.get(i);
      //     }
      // }
  
      private static void reverseSort(int[] arr){
          List<Integer> list = new ArrayList<>();
          for (int i=0; i<arr.length; i++){
              list.add(arr[i]);
          }
          Collections.sort(list, Collections.reverseOrder()); // collections.sort uses nlogn in backend
          for (int i = 0; i < arr.length; i++){
              arr[i] = list.get(i);
          }
      }
  
      private static void reverseSort(long[] arr){
          List<Long> list = new ArrayList<>();
          for (int i=0; i<arr.length; i++){
              list.add(arr[i]);
          }
          Collections.sort(list, Collections.reverseOrder()); // collections.sort uses nlogn in backend
          for (int i = 0; i < arr.length; i++){
              arr[i] = list.get(i);
          }
      }
  
      private static void reverseSort(ArrayList<Integer> list){
          Collections.sort(list, Collections.reverseOrder());
      }
  
      private static int lowerBound(int[] arr, int x){
          int n = arr.length, si = 0, ei = n - 1;
          while(si <= ei){
              int mid = si + (ei - si)/2;
              if(arr[mid] == x){
                  if(mid-1 >= 0 && arr[mid-1] == arr[mid]){
                      ei = mid-1;
                  }else{
                      return mid;
                  }
              }else if(arr[mid] > x){
                  ei = mid - 1; 
              }else{
                  si = mid+1;
              }
          }
          return si; 
      }
  
      private static int upperBound(int[] arr, int x){
          int n = arr.length, si = 0, ei = n - 1;
          while(si <= ei){
              int mid = si + (ei - si)/2;
              if(arr[mid] == x){
                  if(mid+1 < n && arr[mid+1] == arr[mid]){
                      si = mid+1;
                  }else{
                      return mid + 1;
                  }
              }else if(arr[mid] > x){
                  ei = mid - 1; 
              }else{
                  si = mid+1;
              }
          }
          return si; 
      }
  
      private static int upperBound(ArrayList<Integer> list, int x){
          int n = list.size(), si = 0, ei = n - 1;
          while(si <= ei){
              int mid = si + (ei - si)/2;
              if(list.get(mid) == x){
                  if(mid+1 < n && list.get(mid+1) == list.get(mid)){
                      si = mid+1;
                  }else{
                      return mid + 1;
                  }
              }else if(list.get(mid) > x){
                  ei = mid - 1; 
              }else{
                  si = mid+1;
              }
          }
          return si; 
      }
  
      // (x^y)%p in O(logy)
      private static long power(long x, long y){
          long res = 1; 
          x = x % mod;
          while(y > 0){
              if ((y & 1) == 1){
                  res = (res * x) % mod;
              }
              y = y >> 1; 
              x = (x * x) % mod;
          }
          return res;
      }
  
      public static boolean nextPermutation(int[] arr) {
          if(arr == null || arr.length <= 1){
              return false;
          }
          
          int last = arr.length-2;
          while(last >= 0){
              if(arr[last] < arr[last+1]){
                  break;
              }
              last--;
          }
  
          if (last < 0){
                return false;
          }
          
          if(last >= 0){
              int nextGreater = arr.length-1;
              for(int i=arr.length-1; i>last; i--){
                  if(arr[i] > arr[last]){
                      nextGreater = i;
                      break;
                  }
              }
              swap(arr, last, nextGreater);
          }
          
          reverse(arr, last+1, arr.length-1);
          return true;
      }
      
      private static void swap(int[] arr, int i, int j){
          int temp = arr[i];
          arr[i] = arr[j];
          arr[j] = temp;
      }
      
      private static void reverse(int[] arr, int i, int j){
          while(i < j){
              swap(arr, i++, j--);
          }
      }
  
      private static String reverseStr(String s){
          StringBuilder sb = new StringBuilder(s);
          return sb.reverse().toString();
      }
  
      // TC- O(logmax(a,b))
      private static int gcd(int a, int b) {
          if(a == 0){
              return b;
          }
          return gcd(b%a, a);
      }
  
      private static long gcd(long a, long b) {
          if(a == 0L){
              return b;
          }
          return gcd(b%a, a);
      }
  
      private static long lcm(long a, long b) {
          return a / gcd(a, b) * b;
      }
  
      // TC- O(logmax(a,b))
      private static int lcm(int a, int b) {
          return a / gcd(a, b) * b;
      }
  
      private static long inv(long x){
          return power(x, mod - 2);
      }
  
      private static long summation(long n){
          return (n * (n + 1L)) >> 1;
      } 
  }