package main
import (
"bufio"
"fmt"
"os"
)
func main() {
in := bufio.NewReader(os.Stdin)
var n int
fmt.Fscan(in, &n)
var s string
fmt.Fscan(in, &s)
size := 1 << n
f := make([]int64, size)
for i := 0; i < size; i++ {
if s[i] == '1' {
f[i] = 1
}
}
for step := 1; step < size; step *= 2 {
for i := 0; i < size; i += 2 * step {
for j := i; j < i+step; j++ {
u := f[j]
v := f[j+step]
f[j] = u + v
f[j+step] = u - v
}
}
}
p3 := make([]int64, n+1)
p3[0] = 1
for i := 1; i <= n; i++ {
p3[i] = p3[i-1] * 3
}
var Y int64 = 0
for z := 0; z < size; z++ {
if f[z] == 0 {
continue
}
zPop := 0
for i := 0; i < n; i++ {
if (z >> i & 1) == 1 {
zPop++
}
}
var sumZ int64 = 0
for w := 0; w < size; w++ {
if f[w] == 0 || f[z^w] == 0 {
continue
}
wMinusZPop := 0
for i := 0; i < n; i++ {
if (w>>i&1) == 1 && (z>>i&1) == 0 {
wMinusZPop++
}
}
term := f[w] * f[z^w] * p3[n-zPop-wMinusZPop]
if (zPop+wMinusZPop)%2 != 0 {
term = -term
}
sumZ += term
}
Y += f[z] * sumZ
}
Y /= (1 << (2 * n))
mod := int64(1000000007)
p6 := int64(1)
for i := 0; i < n; i++ {
p6 = (p6 * 6) % mod
}
Y %= mod
ans := (p6 - 2*Y) % mod
if ans < 0 {
ans += mod
}
fmt.Println(ans)
}