#include <bits/stdc++.h>
using namespace std;
const int N = 20, P = 1e9 + 7, M = (1 << N) + 50, I = P - P / 2;
int mul(int a, int b) { return 1ll * a * b % P; }
int sub(int a, int b) {
  a -= b;
  return a < 0 ? a + P : a;
}
int add(int a, int b) {
  a += b;
  return a >= P ? a - P : a;
}
void fwt(int n, int *x, int op) {
  for (int s = 2; s <= n; s <<= 1) {
    int m = s >> 1;
    for (int j = 0; j < n; j += s)
      for (int k = 0; k < (m); ++k) {
        int a = x[j + k], b = x[j + m + k];
        x[j + k] = add(a, b);
        x[j + m + k] = sub(a, b);
        if (op == -1) {
          x[j + k] = mul(x[j + k], I);
          x[j + m + k] = mul(x[j + m + k], I);
        }
      }
  }
}
void mul(int n, int *srca, int *srcb, int *dest) {
  static int a[M], b[M];
  for (int i = 0; i < (n); ++i) a[i] = srca[i], b[i] = srcb[i];
  fwt(n, a, 1), fwt(n, b, 1);
  for (int i = 0; i < (n); ++i) dest[i] = mul(a[i], b[i]);
  fwt(n, dest, -1);
}
int n, m, f[1 << N], g[1 << N], ans, cnt[1 << N], pwr[N + 1];
int main(int argc, char *argv[]) {
  scanf("%d", &n);
  m = 1 << n;
  for (int i = 0; i < (m); ++i) {
    char c;
    scanf(" %c", &c);
    f[i] = c - '0';
  }
  mul(m, f, f, g);
  cnt[0] = 0;
  for (int i = 1; i < (m); ++i) cnt[i] = cnt[i >> 1] + (i & 1);
  pwr[0] = 1;
  for (int i = 1; i <= (n); ++i) pwr[i] = mul(pwr[i - 1], 2);
  for (int i = 0; i < (m); ++i) {
    ans = add(ans, mul(g[i], pwr[n - cnt[i]]));
  }
  ans = mul(3, ans);
  printf("%d\n", ans);
  return 0;
}
