description: Luntik came out for a morning stroll and found an array a of length n. He calculated the sum s of the elements of the array (s= ∑_{i=1}^{n} a_i). Luntik calls a subsequence of the array a nearly full if the sum of the numbers in that subsequence is equal to s-1.
  
  Luntik really wants to know the number of nearly full subsequences of the array a. But he needs to come home so he asks you to solve that problem!
  
  A sequence x is a subsequence of a sequence y if x can be obtained from y by deletion of several (possibly, zero or all) elements.
  
  Input
  
  The first line contains a single integer t (1 ≤ t ≤ 1000) — the number of test cases. The next 2 ⋅ t lines contain descriptions 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 (1 ≤ n ≤ 60) — the length of the array.
  
  The second line contains n integers a_1, a_2, …, a_n (0 ≤ a_i ≤ 10^9) — the elements of the array a.
  
  Output
  
  For each test case print the number of nearly full subsequences of the array.
  
  Example
  
  Input
  
  
  5
  5
  1 2 3 4 5
  2
  1000 1000
  2
  1 0
  5
  3 0 2 1 1
  5
  2 1 0 3 0
  
  
  Output
  
  
  1
  0
  2
  4
  4
  
  Note
  
  In the first test case, s=1+2+3+4+5=15, only (2,3,4,5) is a nearly full subsequence among all subsequences, the sum in it is equal to 2+3+4+5=14=15-1.
  
  In the second test case, there are no nearly full subsequences.
  
  In the third test case, s=1+0=1, the nearly full subsequences are (0) and () (the sum of an empty subsequence is 0).
solution: #include <bits/stdc++.h>
  template <class t>
  inline void read(t &s) {
    s = 0;
    signed f = 1;
    char c = getchar();
    while (!isdigit(c)) {
      if (c == '-') f = -1;
      c = getchar();
    }
    while (isdigit(c)) s = (s << 3) + (s << 1) + (c ^ 48), c = getchar();
    ;
    s *= f;
  }
  template <class t, class... A>
  inline void read(t &x, A &...a) {
    read(x);
    read(a...);
  }
  template <class t>
  inline void write(t x) {
    if (x < 0) putchar('-'), x = -x;
    static long long buf[50], top = 0;
    while (x) buf[++top] = x % 10, x /= 10;
    if (!top) buf[++top] = 0;
    while (top) putchar(buf[top--] ^ '0');
  }
  inline void setIn(std::string s) {
    freopen(s.c_str(), "r", stdin);
    return;
  }
  inline void setOut(std::string s) {
    freopen(s.c_str(), "w", stdout);
    return;
  }
  inline void setIO(std::string s = "") {
    setIn(s + ".in");
    setOut(s + ".out");
    return;
  }
  template <class t>
  inline bool ckmin(t &x, t y) {
    if (x > y) {
      x = y;
      return 1;
    }
    return 0;
  }
  template <class t>
  inline bool ckmax(t &x, t y) {
    if (x < y) {
      x = y;
      return 1;
    }
    return 0;
  }
  inline long long lowbit(long long x) { return x & (-x); }
  inline void work() {
    long long n, x;
    read(n);
    long long zr = 0, on = 0;
    while (n--) read(x), zr += !x, on += (x == 1);
    write((1LL << zr) * on), putchar('\n');
  }
  signed main(void) {
    long long t;
    read(t);
    while (t--) work();
    return 0;
  }
  