1 #include<cstdio>
2 #include<cstring>
3 #include<algorithm>
4 #include<cmath>
5
6 using namespace std;
7
8 int a[4098],n;
9
10 long long fac[14],ans=0;
11
12 void init(){fac[1]=1;for(int i=2;i<=n;i++)fac[i]=fac[i-1]*i;}
13
14 int read()
15 {
16 int x=0;char ch=getchar();
17 while(ch<‘0‘||ch>‘9‘)ch=getchar();
18 while(ch>=‘0‘&&ch<=‘9‘)x=x*10+ch-‘0‘,ch=getchar();
19 return x;
20 }
21
22 void swap(int x,int y,int nu)
23 {
24 for(int i=x,j=y,nn=0;nn<nu;nn++)
25 swap(a[i+nn],a[j+nn]);
26 }
27
28 void DFS(int dep,int sco)
29 {
30 if(dep==n)
31 {
32 ans+=fac[sco];
33 return;
34 }
35 int temp=1<<(dep+1),stack[4]={0,0,0,0},top=0;
36 for(int i=1;i<(1<<n);i+=temp)
37 {
38 if(a[i+(temp>>1)-1]+1!=a[i+(temp>>1)])stack[++top]=i+(temp>>1)-1;
39 if(top>2)return;
40 }
41 if(top==0)
42 {
43 DFS(dep+1,sco);
44 return;
45 }
46 else if(top==1)
47 {
48 if(a[stack[1]-(temp>>1)+1]!=a[stack[1]+(temp>>1)]+1)return;
49 swap(stack[top]-(temp>>1)+1,stack[top]+1,temp>>1);
50 DFS(dep+1,sco+1);
51 swap(stack[top]-(temp>>1)+1,stack[top]+1,temp>>1);
52 return;
53 }
54 else
55 {
56 if(a[stack[1]]+1==a[stack[2]+1]&&a[stack[2]]+1==a[stack[1]+1])
57 {
58 swap(stack[1]-(temp>>1)+1,stack[2]-(temp>>1)+1,temp>>1);
59 DFS(dep+1,sco+1);
60 swap(stack[1]-(temp>>1)+1,stack[2]-(temp>>1)+1,temp>>1);
61 swap(stack[1]+1,stack[2]+1,temp>>1);
62 DFS(dep+1,sco+1);
63 swap(stack[1]+1,stack[2]+1,temp>>1);
64 }
65 else if(a[stack[1]]+1==a[stack[2]-(temp>>1)+1]&&a[stack[1]+(temp>>1)]+1==a[stack[2]+1])
66 {
67 swap(stack[1]+1,stack[2]-(temp>>1)+1,temp>>1);
68 DFS(dep+1,sco+1);
69 swap(stack[1]+1,stack[2]-(temp>>1)+1,temp>>1);
70 }
71 else if(a[stack[2]]+1==a[stack[1]-(temp>>1)+1]&&a[stack[2]+(temp>>1)]+1==a[stack[1]+1])
72 {
73 swap(stack[2]+1,stack[1]-(temp>>1)+1,temp>>1);
74 DFS(dep+1,sco+1);
75 swap(stack[2]+1,stack[1]-(temp>>1)+1,temp>>1);
76 }
77 return;
78 }
79 }
80
81 int main()
82 {
83 n=read();
84 init();
85 for(int i=1;i<=(1<<n);i++)
86 a[i]=read();
87 DFS(0,0);
88 printf("%lld",ans);
89 return 0;
90 }