#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double

ll modpower(ll a, ll r, ll mod){ //a^r
    ll x = 1;
    if (r < 0) r = r%(mod-1)+mod-1;
    a %= mod;
    while (r > 0) {
        if (r & 1) x = x * a % mod;
        r >>= 1;
        a = a * a % mod;
    }
    return x;
}

ll modinv(ll a, ll mod) {
    //a*ret%mod == gcd(a, mod)
    ll x = 0, y = 1, u = 1, v = 0, b = mod;
    while (b != 0) {
        ll q = a/b;
        a %= b;
        swap(a, b);
        u -= q*x;
        swap(u, x);
        v -= q*y;
        swap(y, v);
    }
    if (u > 0) return u;
    else return u+mod;
}

vector<ll> fact;
vector<ll> invfact;

void set_fact(ll n, ll mod){
    fact.resize(n+1, 1);
    invfact.resize(n+1, 1);
    for (ll i = 2; i <= n; i++) {
        fact[i] = fact[i-1] * i % mod;
    }
    invfact[n] = modinv(fact[n], mod);
    for (ll i = n-1; i >= 2; i--) {
        invfact[i] = invfact[i+1] * (i+1) % mod;
    }
    return;
}

ll comb(ll n, ll k, ll mod) {
    if (k > n || k < 0) return 0;
    if (k == n || k == 0) return 1;
    return fact[n] * invfact[n-k] % mod * invfact[k] % mod;
}

int main() {
    ll N, M;
    cin >> N >> M;
    ll mod = 998244353;
    set_fact(N+M+10, mod);
    vector<vector<ll>> dp(M+1, vector<ll>(21, 0));
    for (ll i = M; i >= 2; i--) {
        dp[i][1] = 1;
        for (ll j = 2; j <= 20; j++) {
            for (ll k = i*2; k <= M; k += i) {
                dp[i][j] += dp[k][j-1];
                if (dp[i][j] >= mod) dp[i][j] -= mod;
            }
        }
    }
    ll ans = 1;
    for (ll i = 2; i <= M; i++) {
        for (ll j = 1; j <= 20; j++) {
            ans = (ans+dp[i][j]*comb(N, j, mod))%mod;
        }
    }
    cout << ans << endl;
    
    return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
void read (int &x) {
    char ch = getchar(); x = 0; int f = 0;
    while (!isdigit(ch)) { if (ch == '-') f = 1; ch = getchar(); }
    while (isdigit(ch)) x = x * 10 + ch - 48, ch = getchar();
    if (f) x = -x;
} const int N = 2e5 + 5, mod = 998244353;
int qpow (int x, int y) {
    int t = 1;
    while (y) {
        if (y & 1) t = t * x % mod;
        x = x * x % mod, y >>= 1;
    }
    return t;
}
int n, m, res, a[N], t, p[N * 2], in[N * 2], b[N], tot, k[N];
int C (int x, int y) {
    return p[x] * in[y] % mod * in[x - y] % mod;
}
void prework () {
    p[0] = 1;
    for (int i = 1; i <= n + m; ++i) p[i] = p[i - 1] * i % mod;
    in[n + m] = qpow (p[n + m], mod - 2);
    for (int i = n + m; i >= 1; --i) in[i - 1] = in[i] * i % mod;

    for (int i = 2; i * i <= m; ++i)
        if (!k[i]) {
            b[++tot] = i;
            for (int j = i; j * j <= m; j += i) k[j] = 1;
        }
}
void work (int x) {
    t = 0;
    for (int i = 1; i <= tot && b[i] <= x; ++i) {
        int cnt = 0;
        while (x % b[i] == 0) ++cnt, x /= b[i];
        if (cnt) a[++t] = cnt;
    }
    if (x > 1) a[++t] = 1; int tmp = 1;
    for (int i = 1; i <= t; ++i) {
        tmp = tmp * C (a[i] + n - 1, a[i]) % mod;
    }
    // printf ("%lld %lld %lld\n", x, tmp, b[1]);
    (res += tmp) %= mod;
}
signed main() {
    read (n), read (m); prework ();
    // printf ("%d\n", tot);
    for (int i = 1; i <= m; ++i) work (i);
    printf ("%lld\n", res);
}
