#include<bits/stdc++.h>
#define N 200005
#define Mod 998244353
#define MOD(x) (x>=Mod)&&(x-=Mod)
#define Ms(a,b) memset(a,b,sizeof a)
#define db(x) cerr<<#x<<"="<<x<<endl;
#define db2(x,y) cerr<<#x<<"="<<x<<" "<<#y<<"="<<y<<endl;
#define db3(x,y,z) cerr<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl;
using namespace std;
int rd(){
    int res=0,c,f=0;
    while(!isdigit(c=getchar()))f=c=='-';
    do res=(res<<1)+(res<<3)+(c^48);
    while(isdigit(c=getchar()));
    return f?-res:res;
}
int dp[N][18];
int n,m;
int main(){
    n=rd(),m=rd(),dp[0][0]=1;
    for(int i=1;i<=n;i++)
        for(int j=0;j<=17;j++)
            for(int k=0;k<=j;k++)
                dp[i][j]+=dp[i-1][j-k],MOD(dp[i][j]);
    int res=0;
    for(int i=1;i<=m;i++){
        int now=1,x=i;
        for(int j=2;1ll*j*j<=x;j++){
            int t=0;
            while(x%j==0)x/=j,++t;
            now=1ll*now*dp[n][t]%Mod;
        }
        if(x!=1)now=1ll*now*n%Mod;
        res+=now,MOD(res);
    }
    printf("%d\n",res);
    return 0;
}

#include <bits/stdc++.h>
#define rep(i,n) for(int i=0; i<(n); i++)
#define reps(i,s,n) for(int i=(s); i<(n); i++)
#define all(v) v.begin(),v.end()
#define outve(v) for(auto i : v) cout << i << " ";cout << endl
#define outmat(v) for(auto i : v){for(auto j : i) cout << j << " ";cout << endl;}
#define in(n,v) for(int i=0; i<(n); i++){cin >> v[i];}
#define out(n) cout << (n) << endl
#define fi first
#define se second
#define pb push_back
#define si(v) int(v.size())
#define len(v) int(v.length())
#define lob(v,n) lower_bound(all(v),n)
#define lobi(v,n) lower_bound(all(v),n) - v.begin()
#define upb(v,n) upper_bound(all(v),n)
#define upbi(v,n) upper_bound(all(v),n) - v.begin()
#define mod 998244353
#define infi 1010000000
#define infl 1100000000000000000
#define cyes cout << "Yes" << endl
#define cno cout << "No" << endl
#define csp << " " <<
#define outset(n) cout << fixed << setprecision(n);
using namespace std;
using ll = long long;
using ld = long double;
using vi = vector<int>;
using vvi = vector<vector<int>>;
using vd = vector<double>;
using vvd = vector<vector<double>>;
using vl = vector<ll>;
using vvl = vector<vector<ll>>;
using pii = pair<int,int>;
using pll = pair<ll,ll>;
template<typename T> using ve = vector<T>;
template<typename T> using pq2 = priority_queue<T>;
template<typename T> using pq1 = priority_queue<T,vector<T>,greater<T>>;
template<typename T> bool chmax(T &a, T b) {if(a < b) {a = b;return 1;}return 0;}
template<typename T> bool chmin(T &a, T b) {if(a > b) {a = b;return 1;}return 0;}


class Combination {
    vl fac,finv,inv;
public:
    Combination(ll n) {
        n++;
        fac.resize(n);finv.resize(n);inv.resize(n);
        
        fac[0] = fac[1] = 1;
        finv[0] = finv[1] = 1;
        inv[1] = 1;
        reps(i,2,n){
            fac[i] = fac[i-1]*(ll)i%mod;
            inv[i] = (ll)mod - inv[mod%i]*(ll)(mod/i)%mod;
            finv[i] = finv[i-1]*inv[i]%mod;
        }
    }
    
    ll com(ll n, ll m){
        if(n < m) return 0;
        if(n < 0 || m < 0) return 0;
        return fac[n]*(finv[m]*finv[n-m]%mod)%mod;
    }
};


class Prime {
    int N;
    
public:
    vi prime_list, f;
    Prime(int n){
        N = n;
        f.resize(N+1);
        for (ll i = 2; i <= N; i++) {
            if(f[i]) continue;
            f[i] = i;
            prime_list.pb(i);
            for (ll j = i*i; j <= N; j += i) {
                if(!f[j]) f[j] = i;
            }
        }
    }
    
    bool is_prime(int n){return f[n] == n;}
    
    vi prime_factorize(int n){
        vi res;
        while (n > 1) {
            res.pb(f[n]);
            n /= f[n];
        }
        return res;
    }
    
    ve<pii> prime_factorize_pii(int n){
        vi p_list = prime_factorize(n);
        if(p_list.size() == 0) return {};
        ve<pii> res(1,{p_list[0],0});
        for (int p : p_list) {
            if(res.back().fi == p) res.back().se++;
            else res.pb(make_pair(p,1));
        }
        
        return res;
    }
    
    
    
};





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

    
    int N,M;
    cin >> N >> M;
    
    if(N == 1){
        cout << M << endl;
        return 0;
    }
    
    Prime P(400010);
    ll ans = 0;
    
    Combination C(400010);
    
    rep(i,M){
        ve<pii> a = P.prime_factorize_pii(i+1);
        ll aa = 1LL;
        for (pii p : a) {
            aa *= C.com((ll)(N-1LL+(ll)p.se),(ll)(N-1LL));
            aa %= mod;
        }
        //cout << i+1 csp aa << endl;
        ans += aa;
        ans %= mod;
    }

    cout << ans << endl;

    return 0;
}
