Problem: Let's assume that set S consists of m distinct intervals [l1, r1], [l2, r2], ..., [lm, rm] (1 ≤ li ≤ ri ≤ n; li, ri are integers).

Let's assume that f(S) is the maximum number of intervals that you can choose from the set S, such that every two of them do not intersect. We assume that two intervals, [l1, r1] and [l2, r2], intersect if there is an integer x, which meets two inequalities: l1 ≤ x ≤ r1 and l2 ≤ x ≤ r2.

Sereja wonders, how many sets S are there, such that f(S) = k? Count this number modulo 1000000007 (109 + 7).

Input

The first line contains integers n, k (1 ≤ n ≤ 500; 0 ≤ k ≤ 500).

Output

In a single line, print the answer to the problem modulo 1000000007 (109 + 7).

Examples

Input

3 1


Output

23


Input

3 2


Output

32


Input

2 0


Output

1


Input

2 2


Output

2

Solution (in JAVA):

Solution:
import java.io.*;
import java.util.*;
import java.math.BigInteger;
import java.util.Collections.*;
import static java.lang.Math.*;
import static java.lang.Math.max;
import static java.lang.Math.min;
import static java.util.Arrays.*;
import static java.math.BigInteger.*;


public class Main{

    void run(){
        Locale.setDefault(Locale.US);
        boolean my;
        try {
            my = System.getProperty("MY_LOCAL") != null;
        } catch (Exception e) {
            my = false;

        }
        try{
            err = System.err;
            if( my ){
                sc  = new FastScanner(new BufferedReader(new FileReader("input.txt")));
//                sc  = new FastScanner(new BufferedReader(new FileReader("C:\\myTest.txt")));
                out = new PrintWriter   (new FileWriter("output.txt"));
            }
            else {
                sc = new FastScanner(new BufferedReader(new InputStreamReader(System.in)));
                out = new PrintWriter(new OutputStreamWriter(System.out));
            }
//            out = new PrintWriter(new OutputStreamWriter(System.out));
        }catch(Exception e){
            MLE();
        }
        if( my )
            tBeg = System.currentTimeMillis();
        solve();
        if( my )
            err.println( "TIME: " + (System.currentTimeMillis() - tBeg ) / 1e3 );
        exit(0);
    }

    void exit( int val ){
        err.flush();
        out.flush();
        System.exit(val);
    }

    double tBeg;
    FastScanner sc;
    PrintWriter out;
    PrintStream err;

    class FastScanner{

        StringTokenizer st;
        BufferedReader br;

        FastScanner( BufferedReader _br ){
            br = _br;
        }

        String readLine(){
            try {
                return br.readLine();
            } catch (IOException e) {
                return null;
            }
        }

        String next(){
            while( st==null || !st.hasMoreElements() )
                st = new StringTokenizer(readLine());
            return st.nextToken();
        }

        int nextInt(){ return Integer.parseInt(next()); }
        long nextLong(){ return Long.parseLong(next()); }
        double nextDouble(){ return Double.parseDouble(next()); }
    }

    void MLE(){
        int[][] arr = new int[1024*1024][]; for( int i = 0; i < 1024*1024; ++i ) arr[i] = new int[1024*1024];
    }

    void MLE( boolean doNotMLE ){ if( !doNotMLE ) MLE(); }

    void TLE(){
        for(;;);
    }

    public static void main(String[] args) {
        new Main().run();
//        new Thread( null, new Runnable() {
//            @Override
//            public void run() {
//                new Main().run();
//            }
//        }, "Lolka", 256_000_000L ).run();
    }

    ////////////////////////////////////////////////////////////////

    final int mod = (int)1e9 + 7;
    int n, k;
    long[][] dp0, dp1;
    long[] pow2 = new long[600];
    long[] pow2Inv = new long[600];
    {
        pow2[0] = 1;
        for (int i = 1; i < pow2.length; i++) {
            pow2[i] = (pow2[i-1] * 2) % mod;
        }
        for (int i = 0; i < pow2Inv.length; i++) {
            pow2Inv[i] = valueOf(pow2[i]).modInverse(valueOf(mod)).intValue();
        }
    }

    long add( long a, long b ){
        long c = a + b;
        if( mod <= c ) c -= mod;
        return c;
    }

    void solve(){
        n = sc.nextInt();
        k = sc.nextInt();
        dp0 = new long[k+1][n+1];
        for (long[] val : dp0) fill(val, 0L);

        for (int sz = 1; sz <= n; sz++) {
            dp1  = new long[k+1][n+1];

            long[] sumDiv = null;// = new long[sz+1];
            long[] sum = null; // = new long[sz+1];
            for (int cnt  = 0; cnt <= k; cnt++) {
                long[] newSumDiv = new long[sz+1];
                long[] newSum = new long[sz+1];
                for (int last = 0; last <= sz; last++) {
                    if( cnt == 0 ){
                        if( last == 0 ) dp1[cnt][last] = 1L;
                        else dp1[cnt][last] = 0L;
                    }
                    else if( sz == last ){
                        if( cnt == 1 ){
                            dp1[cnt][last] = (pow2[last]-1);
                        }
                        else{
                            dp1[cnt][last] = 0L;
                            dp1[cnt][last] += sumDiv[sz-1]*pow2[sz] - sum[sz-1];
                        }
                    }
                    else{
                        dp1[cnt][last] = dp0[cnt][last] * pow2[last];
                    }
                    dp1[cnt][last] = ( dp1[cnt][last]%mod + mod ) % mod;

                    if( 1 <= last ){
                        newSumDiv[last] = (dp1[cnt][last] * pow2Inv[last]) % mod;
                        newSum[last] = dp1[cnt][last];
                    }
                }

                for (int i = 1; i < newSum.length; i++) {
                    newSum[i] = add( newSum[i], newSum[i-1] );
                    newSumDiv[i] = add( newSumDiv[i], newSumDiv[i-1] );
                }
                sum = newSum;
                sumDiv = newSumDiv;
            }
           //
            dp0 = dp1;
        }
        long ans = 0;
        for (int last = 0; last <= n; last++) {
            ans += dp0[k][last];
        }
        ans %= mod;
        out.println( ans );
    }


}