#include<cstdio> #include<string> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int M=10010; int n; int a[M]; long long ans; long long b[14]; void Swap(int i,int j,int l){ for(int k=1;k<=l;k++) swap(a[i+k-1],a[j+k-1]); } bool Check(int x){ for(int i=1;i<=(1<<(n-x));i++) if(a[(i-1)*(1<<x)+1]+(1<<(x-1))!=a[(i-1)*(1<<x)+(1<<(x-1))+1]) return false; return true; } void DFS(int x,int cnt){ int tmp[6],sum=0; if(x&&!Check(x)) return ; if(x==n){ ans+=b[cnt]; return ; } DFS(x+1,cnt); for(int i=1;i<=(1<<(n-(x+1)+1));i+=2) if (a[i*(1<<x)+1]!=a[(i-1)*(1<<x)+1]+(1<<x)) if(sum==4) return ; else{ sum++; tmp[sum]=i; sum++; tmp[sum]=i+1; } if(!sum) return ; for(int i=1;i<sum;i++) for(int j=i+1;j<=sum;j++){ Swap(((1<<x)*(tmp[i]-1)+1),(1<<x)*(tmp[j]-1)+1,(1<<x)); DFS(x+1,cnt+1); Swap(((1<<x)*(tmp[i]-1)+1),(1<<x)*(tmp[j]-1)+1,(1<<x)); } } void Init(){ b[0]=1; for(int i=1;i<=12;i++) b[i]=b[i-1]*i; } int main(){ Init(); scanf("%d",&n); for(int i=1;i<=(1<<n);i++) scanf("%d",&a[i]); DFS(0,0); printf("%lld\n",ans); return 0; }