分别考虑每层的单点贡献,计数。
#include <bits/stdc++.h>
#ifdef LOCAL
#define debug(x) cout<<#x<<" = "<<(x)<<endl;
#else
#define debug(x) 1;
#endif
#define chmax(x,y) x=max(x,y)
#define chmin(x,y) x=min(x,y)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lowbit(x) x&-x
#define pb push_back
#define fir first
#define sec second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
const int mod = 1e9 + 7;
#define rep(i,a,b) for(int i=a;i<b;++i)
#define per(i,a,b) for(int i=(a)-1;i>=b;--i)
#define x first
#define y second
const int MX = (1<<18)+5;
int a[MX];
ll sum[MX],fac[MX],inv[MX];
void init()
{
int n = 1<<18;
fac[0] = fac[1] = inv[0] = inv[1] = 1;
for(int i = 2; i <= n; i++) fac[i] = i*fac[i-1]%mod;
for(int i = 2; i <= n; i++) inv[i] = (mod-mod/i)*inv[mod%i]%mod;
for(int i = 2; i <= n; i++) inv[i] = inv[i]*inv[i-1]%mod;
}
ll C(int n,int m)
{
if(n < m) return 0;
return fac[n]*inv[n-m]%mod *inv[m]%mod;
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif // LOCAL
init();
int k;
scanf("%d",&k);
for(int i = 1; i <= (1<<k); i++) scanf("%d",&a[i]);
int n = 1<<k;
ll ans = 0;
for(int i = k-1; i >= 0; i--){
int x = 1<<i, t = 1<<(k-i-1);
ll tmp = fac[t]*fac[t]%mod*fac[n-2*t]*2%mod*x%mod;
for(int j = n; j >= 1; j--){
ll q = C(n-j-t,t-1)*a[j]%mod;
ans = (ans + sum[j+1]*q%mod*tmp%mod)%mod;
ll tj = C(n-j,t-1)*a[j]%mod;
sum[j] = (sum[j+1] + tj)%mod;
}
}
ans = ans*inv[n]%mod;
cout<<ans<<endl;
return 0;
}