#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;
}

/*

*/
