#include<bits/stdc++.h>
#define debug(x) (cout << "#x = " << x << endl)
#define re register
#define For(i, j, k) for(re int i = j; i <= k; i++)
#define foR(i, j, k) for(re int i = j; i >= k; i--)
#define Cross(i, j, k) for(re int i = j; i; i = k)
using namespace std;
typedef long long ll;
const ll N = 3011;
const ll P = 174086401;
const ll inf = 0x3f3f3f3f3f3f;

/*
    倒推.
    用背包预处理一个数可以被什么构造出来, 
    然后用快速幂把无限制的算出来,然后一步步推回去.
    f[n] = Ans,
    f[i] = f[i + 1] - C[n][构造] * 排列方案 - C[n][构造2] * 排列方案.
    排列方案用错位不相异公式算,预处理阶乘及逆元.
    时间不够了(划掉 . 可惜我只会口胡,悲哀. 
*/

ll n, k;

namespace IO {
    
    #define dd ch = getchar()
    inline ll read() {
        ll x = 0; bool f = 0; char dd;
        for (; !isdigit (ch); dd) f ^= (ch == '-');
        for (; isdigit (ch); dd)  x = (x << 1) + (x << 3) + (ch ^ 48);
        return f? -x: x;
    }
    #undef dd
    
    inline void write ( ll x ) {
        if ( x < 0 ) x = -x, putchar ('-');
        if ( x > 9 ) write ( x / 10 ); putchar ( x % 10 | 48 );
    }
    
    inline void wrn ( ll x ) { write (x); putchar (' '); }
    
    inline void wln ( ll x ) { write (x); putchar ('\n'); }
    
    inline void wlnn ( ll x, ll y ) { wrn (x); wln (y); }
    
}

using namespace IO;

ll C[N + 5][N + 5];

inline void Init () {
    C[0][0] = C[1][1] = 1;
    For ( i, 1, N ) C[i][0] = 1;
    For ( i, 1, N ) For ( j, 1, N )
        C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % P;
}

namespace Subtask1 {
    
    inline void main () {
        switch (n) {
            case 1:
                if ( k <= 1 ) puts("0");
                else puts("1"); break;
            case 2:
                if ( k <= 2 ) puts("0");
                else if ( k <= 4 ) puts("6");
                else if ( k >= 5 ) puts("8"); break;
            case 3: 
                if ( k <= 3 ) puts("10");
                else if ( k <= 4 ) puts("3");
                else if ( k <= 5 ) puts("15");
                else if ( k <= 6 ) puts("24");
                else if ( k <= 7 ) puts("30");
                else if ( k <= 8 ) puts("30");
                else if ( k <= 9 ) puts("30"); break;
            case 4:
                if ( k <= 4 ) puts("0");				
                else if ( k == 5 ) puts("4");				
                else if ( k == 6 ) puts("4");
                else if ( k == 7 ) puts("56");
                else if ( k == 8 ) puts("56");
                else if ( k == 9 ) puts("102");
                else if ( k == 10 ) puts("102");
                else if ( k == 11 ) puts("118");
                else if ( k == 12 ) puts("118");
                else if ( k == 13 ) puts("126");
                else if ( k == 14 ) puts("126");
                else if ( k == 15 ) puts("126");
                else if ( k == 16 ) puts("126"); break;
            case 5:
                if ( k <= 5 ) puts("0");
                else if ( k == 6 ) puts("10");
                else if ( k == 7 ) puts("10");
                else if ( k == 8 ) puts("10");
                else if ( k == 9 ) puts("35");
                else if ( k == 10 ) puts("406");
                else if ( k == 11 ) puts("434");
                else if ( k == 12 ) puts("434");
                else if ( k == 13 ) puts("255");
                else if ( k == 14 ) puts("355");
                else if ( k == 15 ) puts("455");
                else if ( k == 16 ) puts("475");
                else if ( k == 17 ) puts("475");
                else if ( k == 18 ) puts("500");
                else if ( k == 19 ) puts("500");
                else if ( k == 20 ) puts("500");
                else if ( k == 21 ) puts("510");
                else if ( k == 22 ) puts("510");
                else if ( k == 23 ) puts("510");
                else if ( k == 24 ) puts("510");
                else if ( k == 25 ) puts("510"); break;
        }
        exit (0);
    }
    
}

namespace Subtask2 {
    
    ll ans = 0;
    
    inline ll power ( ll a, ll b, ll p ) {
        ll res = 1;
        for (; b; b >>= 1, a = a * a % p) 
            res = (b & 1)? res * a % p: res; return res;
    }
    
    inline void main () {
        Init ();
        For ( i, 0, n ) 
            ans = ( ans + C[n][i] * power (2ll, n - 1, P) ) % P;
        wln (ans % P); exit (0);
    }
    
}

namespace Subtask {
    
    /*
        把矩阵看成两个 01 串？ 
        设 f[i][j] 表示最大连续串长度小于等于 i ，串总长度为 j 的方案数。
        长度为 i 的方案就是 f[i][n] - f[i - 1][n] 。
        因为 j >= i ，所以答案是 ∑k = (1 -> i) f[i][j - k]
        前缀和优化一下，就是 O(n^2) 了。 
        然后现在要求不大于 k 的矩阵构造方案数，
        就是枚举 i * j < k 的所有 f[n][i] - f[n - 1][i]
        最后因为只算了 i * j 的情况，没算 j * i 的情况，所以要乘二。 
    */
    
    ll ans = 0, sum[N], cha[N], f[N][N];

    inline void Upd ( ll &x, ll y ) { (x += y) >= P && (x -= P); }
    
    inline void main () {
        For ( i, 1, n ) {
            f[i][0] = 1, sum[0] = 1;
            For ( j, 1, n ) {
                if (j <= i) f[i][j] = sum[j - 1];
                else f[i][j] = (sum[j - 1] - sum[j - min (i, j) - 1] + P) % P;
                sum[j] = sum[j - 1]; Upd (sum[j], f[i][j]);
            }
            cha[i] = (f[i][n] - f[i - 1][n] + P) % P;
        }
        For ( i, 1, n ) 
            for (re int j = 1; j <= n && i * j < k; j++) 
                Upd (ans, cha[i] * cha[j] % P);
        Upd (ans, ans); wln (ans); exit (0);
    }

}

int main () 
{
// 	freopen("fairy.in", "r", stdin);
// 	freopen("fairy.out", "w", stdout);
    Init ();
    n = read(), k = read();
    if ( k == 1 ) return puts ("0"), 0;
    // if ( n <= 5 ) Subtask1::main ();
    if ( k > n * n ) Subtask2::main ();
    else Subtask::main (); return 0;
}

/*

*/
