#include #include #include #include #include int data[17][17]; const int LIMIT=16; long long int dp[17][16]; int isV(int p1,int p2){ if(p1>p2){ std::swap(p1,p2); } if(data[p1][p2]==1)return p1; return p2; } void f(int p,std::vector& all,std::vector& Ls,std::vector& Rs){ int s=all.size(); int s2=s/2; if((s==2)||(s==Ls.size()+Rs.size())){ if(s==2){ dp[s][isV(all[0],all[1])]+=2; }else{ int x=s/2; for(int j=0;j Ls2,Rs2; f(0,Ls,Ls2,Rs2); f(0,Rs,Ls2,Rs2); for(int i=0;i0)&&(Rs.size() all,Ls,Rs; memset(dp,0,sizeof(dp)); for(int i=0;i