#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
ll gcd(ll a, ll b){return b? gcd(b, a % b): a;}
ll quickpow(ll a, ll b){ll res = 1; while(b){if (b & 1) res = res * a; a = a * a; b >>= 1;} return res;}
// head

const int N = 2e5 + 5, mod = 998244353;
int n, m;
int dp[20][N], c[N][20];

int main(void){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> n >> m;
	c[0][0] = 1;
	for (int i = 1; i <= n; i++) {
		c[i][0] = 1;
		for (int j = 1; j <= 20; j++) {
			c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
		}
	}
	for (int i = 1; i <= m; i++) dp[1][i] = 1;
	for (int i = 1; i <= 18; i++) {
		for (int j = 1; j <= m; j++) {
			for (int k = j + j; k <= m; k += j) {
				dp[i + 1][k] += dp[i][j];
				dp[i + 1][k] %= mod;
			}
		}
	}
	int ans = 0;
	for (int i = 1; i <= 19; i++) {
		int cnt = 0;
		for (int j = 1; j <= m; j++) {
			cnt += dp[i][j];
			cnt %= mod;
		}
		ans += 1ll * cnt * c[n - 1][i - 1] % mod;
		ans %= mod;
	}
	cout << ans << endl;
	return 0;
}

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define endl '\n'
#define sz(v) (int)v.size() 
#define all(v) v.begin(), v.end()
void dbg_out() { cerr << "\b\b]\n"; }
template<typename Head, typename... Tail> void dbg_out(Head H, Tail... T){ cerr << H << ", "; dbg_out(T...);}
#define watch(...) cerr << "[" << #__VA_ARGS__ << "]: [", dbg_out(__VA_ARGS__)

const int N = 4e5 + 5;
const int mod = 998244353;
vector <ll> fac(N+2), reFac(N+2);

ll power(ll a, ll b){
    ll res = 1;
    while(b){
        if(b & 1){
            (res *= a) %= mod;
        }
        (a *= a) %= mod;
        b >>= 1;
    }
    return res;
}

void calc() {
    fac[0] = 1;
    for (int i = 1; i <= N; ++i)
        fac[i] = (fac[i-1] * i) % mod;

    reFac[N] = power(fac[N], mod-2);
    for (int i = N; i > 0; --i){
        reFac[i-1] = (reFac[i] * i) % mod;
    }
}

ll modMul(ll a, ll b) {
    if (a >= mod) a %= mod;
    if (b >= mod) b %= mod;
    return (a * b) % mod;
}

ll nCr(ll a, ll b) {  //nCr => C(n, r)
    if (a < 0 or b < 0 or a < b) return 0LL;
    return modMul(fac[a], modMul(reFac[b], reFac[a - b]));
}

vector <int> factor(N); //factor[i] => smallest prime factor of i

void linear_seive() {
    vector <int> primes;
    
    for (int i = 2; i < N; ++i) {
        if (factor[i] == 0) {
            factor[i] = i;
            primes.push_back(i);
        }
        for (int j = 0; j < sz(primes) and primes[j] <= factor[i] and primes[j] * i < N; ++j) {
            factor[i * primes[j]] = primes[j];
        }
    }
}

map <int, int> factorize(int n) {
    map <int, int> cnts;
    while (n > 1) {
        cnts[factor[n]]++;
        n /= factor[n];
    }
    return cnts;
};

int main(){
    ios_base::sync_with_stdio(false); cin.tie(nullptr);

    calc();
    linear_seive();

    int n, m; cin >> n >> m;
    ll ans = 0;
    for (int i = 1; i <= m; ++i) {
        map <int, int> cnts = factorize(i);
        ll tot = 1;
        for (auto j: cnts) {
            tot *= nCr(j.second + n - 1, n-1);
            tot %= mod;
        }   
        ans += tot;
        ans %= mod;
    }

    cout << ans;


    return 0;
}


/*
 * Put the values of A[n-1] => {1...m}, for each value of A[n-1], calculate the number of sequences.
 * How to calculate them?
 * Use Binomial Coeff / Stars and Bars.
 * Since we have fixed the A[n-1] element, we have remained n-1 elements.
 * A[n-1] as: for each 'i', 1 <= i <= m, calculate the prime factorization of 'i' suppose: p^a * q^b.
   then, using stars and bars: nCr(a+n-1, n-1) * nCr(b+n-1, n-1).
   So answer is: 1 <= i <= m, summation(nCr(cnts(p) + n-1, n-1)), p => prime factor of 'i', cnts(p) => occurence of 'p' in 'i' 

*/