#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
const long double eps = 1e-7;
const int inf = 1000000010;
const long long INF = 10000000000000010LL;
const int mod = 1000000007;
const int MAXN = 510, LOG = 20;
int n, m, k, u, v, x, y, t, a, b, ans;
long long tav[MAXN * MAXN];
long long dp[MAXN][MAXN];
long long get(int i, int j, int k) {
  if (!k && !j) return 1;
  if (i == k) return dp[i][j];
  return dp[k][j] * tav[(i - k) * k] % mod;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  tav[0] = 1;
  for (int i = 1; i < MAXN * MAXN; i++) tav[i] = tav[i - 1] * 2 % mod;
  dp[0][0] = 1;
  for (int i = 1; i < MAXN; i++) {
    for (int j = 1; j <= i; j++) {
      for (int kk = 0; kk < i; kk++)
        dp[i][j] = (dp[i][j] + get(i - 1, j - 1, kk) *
                                   (tav[kk] * (tav[i - kk] - 1) % mod)) %
                   mod;
    }
  }
  cin >> n >> k;
  for (int i = 0; i <= n; i++) ans = (ans + get(n, k, i)) % mod;
  cout << ans << '\n';
  return 0;
}
