#include <bits/stdc++.h>
template <class T>
T Min(const T &a, const T &b) {
  return a < b ? a : b;
}
template <class T>
T Max(const T &a, const T &b) {
  return a > b ? a : b;
}
template <class T>
bool Chkmin(T &a, const T &b) {
  return a > b ? a = b, 1 : 0;
}
template <class T>
bool Chkmax(T &a, const T &b) {
  return a < b ? a = b, 1 : 0;
}
class fast_input {
 private:
  static const int SIZE = 1 << 15 | 1;
  char buf[SIZE], *front, *back;
  void Next(char &c) {
    if (front == back) back = (front = buf) + fread(buf, 1, SIZE, stdin);
    c = front == back ? (char)EOF : *front++;
  }

 public:
  template <class T>
  void operator()(T &x) {
    char c, f = 1;
    for (Next(c); c > '9' || c < '0'; Next(c))
      if (c == '-') f = -1;
    for (x = 0; c >= '0' && c <= '9'; Next(c)) x = x * 10 + c - '0';
    x *= f;
  }
  void operator()(char &c, char l = 'a', char r = 'z') {
    for (Next(c); c > r || c < l; Next(c))
      ;
  }
} input;
const int SN = 20 + 1;
const int SX = 1 << 20 | 1;
const int MOD = 1000000007;
int a[SX], bit[SX];
void FWT(int *, int);
int F(int);
int DF(int);
int main() {
  char c;
  int x, y, z, n;
  input(n);
  for (int i = (0), i_end = (1 << n); i < i_end; ++i)
    input(c, '0', '1'), a[i] = c - '0';
  FWT(a, n);
  for (int i = (0), i_end = (1 << n); i < i_end; ++i)
    a[i] = 1LL * a[i] * a[i] % MOD;
  FWT(a, n);
  x = MOD + 1 >> 1, y = 1;
  for (int i = (1), i_end = (n); i <= i_end; ++i) y = 1LL * y * x % MOD;
  for (int i = (0), i_end = (1 << n); i < i_end; ++i)
    a[i] = 1LL * a[i] * y % MOD;
  for (int i = (1), i_end = (1 << n); i < i_end; ++i)
    bit[i] = bit[i >> 1] + (i & 1);
  x = 0;
  for (int i = (0), i_end = (1 << n); i < i_end; ++i)
    x = (x + (1LL << n - bit[i]) * a[i]) % MOD;
  printf("%d\n", int(3LL * x % MOD));
  return 0;
}
void FWT(int *x, int max_bit) {
  int p, q;
  for (int i = (0), i_end = (max_bit); i < i_end; ++i)
    for (int j = (0), j_end = (1 << max_bit); j < j_end; ++j)
      if (~j >> i & 1) {
        p = x[j], q = x[j + (1 << i)];
        x[j] = F(p + q), x[j + (1 << i)] = DF(p - q);
      }
}
int F(int x) { return x >= MOD ? x - MOD : x; }
int DF(int x) { return x < 0 ? x + MOD : x; }
