1.要用long long 必须的
2.有一些东西是可以预处理的,就预处理一下
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
long long f[10][82][1026]={0};
int n,k,k1[1026]={0};
bool pan(int x,int y)
{
if ((x&1)&&((y&1)||(y&2))) return false;
for (int i=1;(x>>i)>0;i++)
if ((x&(1<<i))&&((y&(1<<i))||(y&(1<<(i+1)))||(y&(1<<(i-1))))) return false;
return true;
}
int main()
{
scanf("%d%d",&n,&k);
f[0][0][1]=1;
int pz=1<<n;
for (int i=0;i<pz;i++)
{
bool b=true;
int j=i;
while (j)
{
if ((j&1)&&(j&2)) b=false;
j>>=1;
}
if (b) k1[++k1[0]]=i;
}
for (int i=1;i<=n;i++)
{
for (int j=0;j<=k;j++)
{
for (int p1=1;p1<=k1[0];p1++)
{
int count,s=k1[p1];
for (count=0;s;s&=s-1)count++;
if (count>j)continue;
for (int p2=1;p2<=k1[0];p2++)
if (pan(k1[p1],k1[p2])) f[i][j][p1]+=f[i-1][j-count][p2];
}
}
}
long long ans=0;
for (int j=1;j<=k1[0];j++)
ans+=f[n][k][j];
printf("%lld",ans);
return 0;
}