#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1<<5
#define MOD 1000000007
using namespace std;
int n,m;
typedef long long ll;
ll dp[2][N];
bool full[N];
bool check(int num){
while(num){
if(num & 1){
if((num>>1) & 1)
num >>= 2;
else
return false;
}
else
num >>= 1;
}
return true;
}
void init(){
memset(dp,0,sizeof(dp));
memset(full,false,sizeof(full));
for(int i = 0; i < (1<<m); i++){
主要用来测试第一行的兼容性
if(check(i)){
full[i] = true;
dp[0][i] = 1;
}
}
}
void solve(){
for(int i = 1; i < n; i++){
memset(dp[i&1],0,sizeof(dp[i&1]));
for(int j = 0; j < (1<<m); j++){
for(int k = 0; k < (1<<m); k++){
if((k | j) == ((1<<m)-1) && full[j & k]){
dp[i&1][j] += dp[(i-1) &1][k];
dp[i&1][j] %= MOD;
}
}
}
}
}
int main(){
while(scanf("%d%d",&n,&m) != EOF){
init();
solve();
printf("%lld\n",dp[(n-1) & 1][(1 << m) -1]);
}
return 0;
}