#include <bits/stdc++.h>
using namespace std;

typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;

#define fastio() ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0)
#define test() int t;cin>>t;for(int test=1;test<=t;test++)
#define pb push_back
#define nl cout<<"\n"
#define all(x) x.begin(),x.end()

template<class C> void min_self( C &a, C b ){ a = min(a,b); }
template<class C> void max_self( C &a, C b ){ a = max(a,b); }

const ll MOD = 1000000007;
ll mod( ll n, ll m=MOD ){ n%=m,n+=m,n%=m;return n; }

const int MAXN = 1e5+5;
const int LOGN = 21;
const ll INF = 1e14;
int dx[] = {1,0,-1,0};
int dy[] = {0,1,0,-1};

template<class T1, class T2> void add( T1 &x, T2 y, ll m = MOD )
{
    x += y;
    if( x >= m )
        x -= m;
}

template<class T1, class T2> void sub( T1 &x, T2 y, ll m = MOD )
{
    x -= y;
    if( x < 0 )
        x += m;
}

int main() 
{
    #ifdef gupta_samarth
        freopen("input.txt", "r", stdin);
        freopen("output.txt", "w", stdout);
    #endif
    fastio();

	int n,k;
	cin>>n>>k;

	// (a+b) - (c+d) == k
	// (a+b) == k + (c+d)
	ll ans = 0;
	for(int lower=2;lower<=2*n;lower++)
	{
		int upper = lower + k;

		if( upper > 2*n )
			break;
		if( upper < 2 )
			continue;

		// 1 + upper-1
		// 2 + upper-2
		// 3 + upper-3
		// ..
		// x + upper-x;
		// ..
		// n/2 + upper-n/2
		// x + n, n = upper - x
		// x = upper - n;
		// ll x = max( 0, upper-n-1 );

		// ll ways_lower = 0;
		// ll ways_upper = 0;

		// for(int a=1;a<=n;a++)
		// {
		// 	if( 1 <= upper-a && upper-a <= n )
		// 		ways_upper++;
		// 	if( 1 <= lower-a && lower-a <= n )
		// 		ways_lower++;
		// }

		ll ways_lower = 2 * ( lower/2 - max(0, lower-n-1) ) - ( lower%2 == 0 );
		ll ways_upper = 2 * ( upper/2 - max(0, upper-n-1) ) - ( upper%2 == 0 );

		// if( x != ways_lower || y != ways_upper )
		// {
		// 	assert(false);
		// 	cout<<x<<" MY "<<y,nl;
		// 	cout<<ways_lower<<" orig "<<ways_upper,nl;
		// 	cout<<lower<<" "<<upper<<" "<<n,nl;
		// }

		ans += ways_upper * ways_lower;
	}
	cout<<ans,nl;

    cerr << "\nTime elapsed: " << 1000 * clock() / CLOCKS_PER_SEC << "ms\n";
    return 0;
}

// C++ (GCC 9.2.1)
// 解き直し.
// https://atcoder.jp/contests/arc116/editorial/892
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
#define repex(i, a, b, c) for(int i = a; i < b; i += c)
#define repx(i, a, b) repex(i, a, b, 1)
#define rep(i, n) repx(i, 0, n)
#define repr(i, a, b) for(int i = a; i >= b; i--)
#define a first
#define b second
const LL MOD = 998244353;
const int LIMIT = 202020;
LL FAC[LIMIT], INV[LIMIT];

// Fermat's little theorem から, 大きな冪乗の計算を行う.
// @param a: べき乗したい正整数.
// @param b: 指数.
// @return:  べき乗した計算結果(mod版).
LL mPow(LL a, LL b){
    LL t = 1;
    while(b){
        if(b & 1) t = (t * a) % MOD;
        a = a * a % MOD;
        b >>= 1;
    }
    return t % MOD;
}

// 組み合わせ(nCk)計算用(mod版).
// ※配列FAC, INV は, 事前に計算済のものを使う.
// @param n: 対象となる要素の個数.
// @param k: 選択する要素の個数.
// @return: 組み合わせ(nCk)の計算結果(mod版).
LL combination(LL n, LL k){
    if(n < 0 || k < 0 || k > n) return 0LL;
    if(n == k || k == 0LL) return 1LL;
    LL ret = FAC[n] * INV[k] % MOD * INV[n - k] % MOD;
    return ret;
}

int main(){
    
    // 1. 入力情報.
    int N, M;
    scanf("%d %d", &N, &M);
    FAC[0] = 1;
    repx(i, 1, LIMIT) FAC[i] = (LL)i * FAC[i - 1] % MOD;
    rep(i, LIMIT) INV[i] = mPow(FAC[i], MOD - 2);
    
    // 2. 素数の抽出.
    set<int> st;
    st.insert(2);
    repex(i, 3, 500, 2) {
        bool isPrime = true;
        repex(j, 3, sqrt(i) + 1, 2) {
            if(i % j == 0){
                isPrime = false;
                break;
            }
        }
        if(isPrime) st.insert(i);
    }
    // for(auto &p : st) printf("%d ", p);
    // puts("");
    
    // 3. 解説通り.
    LL ans = 1;
    repx(k, 2, M + 1){
        // 2-1. 素因数分解を行う.
        int n = k;
        map<int, int> m;
        for(auto &p : st){
            while(n % p == 0){
                n /= p;
                m[p]++;
            }
        }
        
        // 2-2. n が 素数 の 場合(ex. 2 * 3 * 5 * 521 などの場合).
        if(n != 1) m[n] = 1;
        
        // 2-3. A[N] = k の場合 を 計算.
        LL t = 1;
        for(auto &p : m){
            t *= combination((LL)(N + p.b - 1), (LL)p.b);
            t %= MOD;
        }
        
        // 2-4. 加算.
        ans += t;
        ans %= MOD;
    }
    
    // 4. 出力.
    printf("%lld\n", ans);
    return 0;
    
}