#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
ll x,y,f[105][75][75],ans;
template <typename T>
void in(T &x){
char c=getchar();
bool f=true;
for(;c<'0'||c>'9';c=getchar())
if(c=='-')
f=false;
for(x=0;c>='0'&&c<='9';c=getchar())
x=(x<<1)+(x<<3)+(c^48);
if(!f)
x=-x;
}
void putf(ll x){
if(x<0)
x=-x,putchar('-');
if(x>9)
putf(x/10);
putchar((x%10)^48);
}
ll bit(ll a,ll xx){
if(xx<1)
return 0;
return a&(1<<(xx-1));
}
ll check(ll a,ll xxx){
if(xxx<1)
return 0;
if(a&(1<<(xxx-1)))
return 1;
return 0;
}
ll at(ll now){
ll c=0;
for(ll k=1;bit(-1,k)<=now;k++){
if(!check(now,k))
continue;
if(!check(now,k-1))
c|=bit(-1,k-2);
if(!check(now,k+1))
c|=bit(-1,k+2);
}
return c;
}
ll at_3(ll nowa,ll nowb){
ll c=0;
for(ll k=1;bit(-1,k)<=nowa;k++){
if(!check(nowa,k))
continue;
if(!check(nowb,k)){
c|=bit(-1,k-1);
c|=bit(-1,k+1);
}
}
}
int main(){
in(x);
in(y);
for(ll i=0;i<(1<<y);i++)
f[1][i][0]=1;
for(ll i=0;i<(1<<y);i++)
for(ll j=0;j<(1<<y);j++){
if((at(i)&j)||(at(j)&i))
continue;
f[2][j][i]=(f[1][i][0]+f[2][j][i])%mod;
}
for(ll i=3;i<=x;i++)
for(ll j=0;j<(1<<y);j++)
for(ll l=0;l<(1<<y);l++){
if((at(j)&l)||(at(l)&j))
continue;
for(ll m=0;m<(1<<y);m++){
if((at(l)&m)||(at(m)&l)||(at_3(j,l)&m)||(at_3(m,l)&j))
continue;
f[i][j][l]=(f[i][j][l]+f[i-1][l][m])%mod;
}
}
for(ll i=0;i<(1<<y);i++)
for(ll j=0;j<(1<<y);j++){
if((at(i)&j)||(at(j)&i))
continue;
ans=(ans+f[x][i][j])%mod;
}
putf(ans);
return 0;
}