#include <iostream>
#include <vector>
using namespace std;
const int MOD = 1000000007;
long long power(long long base, long long exp) {
long long res = 1;
base %= MOD;
while (exp > 0) {
if (exp % 2 == 1) res = (res * base) % MOD;
base = (base * base) % MOD;
exp /= 2;
}
return res;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int w, h;
if (!(cin >> w >> h)) return 0;
vector<long long> row(w + 1, 0);
row[0] = 1;
if (w >= 1) row[1] = 1;
for (int i = 2; i <= w; i++) {
row[i] = (row[i - 1] + row[i - 2]) % MOD;
}
vector<long long> total(w + 1, 0);
for (int i = 1; i <= w; i++) {
total[i] = power(row[i], h);
}
vector<long long> dp(w + 1, 0);
if (w >= 1) dp[1] = total[1];
for (int i = 2; i <= w; i++) {
long long bad_walls = 0;
for (int j = 1; j < i; j++) {
long long split_ways = (dp[j] * total[i - j]) % MOD;
bad_walls = (bad_walls + split_ways) % MOD;
}
dp[i] = (total[i] - bad_walls + MOD) % MOD;
}
cout << dp[w] << "\n";
return 0;
}