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

#define MAXN 200007
#define MOD 998244353


int n , m ;
vector < int > divs[ MAXN ] ;

long long dp[ 21 ][ MAXN ] ;
long long fac[ MAXN ] ;
long long inv[ MAXN ] ;

long long fastpow ( long long x , long long pw ) {
    long long ret = 1 ;
    while ( pw > 0 ) {
        if ( ( pw % 2 ) == 0 ) {
            x = ( x * x ) % MOD ;
            pw /= 2 ;
        }
        else {
            ret = ( ret * x ) % MOD ;
            -- pw ;
        }
    }
    return ret ;
}

void input ( ) {
    scanf ( "%d%d" , &n , &m ) ;
    fac[ 0 ] = 1 ;
    for ( int i = 1 ; i <= n ; ++ i ) {
        fac[ i ] = ( fac[ i - 1 ] * i ) % MOD ;
    }
    inv[ n ] = fastpow ( fac[ n ] , MOD - 2 ) ;
    for ( int i = n - 1 ; i >= 0 ; -- i ) {
        inv[ i ] = ( inv[ i + 1 ] * ( i + 1 ) ) % MOD ;
    }
    for ( int i = 2 ; i <= m ; ++ i ) {
        for ( int j = 2 * i ; j <= m ; j += i ) {
            divs[ j ].push_back ( i ) ;
        }
    }
}

void solve ( ) {
    for ( int i = 2 ; i <= m ; ++ i ) {
        dp[ 1 ][ i ] = 1 ;
    }
    for ( int i = 1 ; i <= 20 ; ++ i ) {
        for ( int j = 2 ; j <= m ; ++ j ) {
            for ( auto x : divs[ j ] ) {
                dp[ i ][ j ] += dp[ i - 1 ][ x ] ;
                if ( dp[ i ][ j ] >= MOD ) { dp[ i ][ j ] -= MOD ; }
            }
        }
    }
    long long ans = 1 ;
    for ( int i = 1 ; i <= 20 ; ++ i ) {
        long long aux = 0 ;
        for ( int j = 2 ; j <= m ; ++ j ) {
            aux += dp[ i ][ j ] ;
            if ( aux >= MOD ) { aux -= MOD ; }
        }
        if ( i > n ) { break ; }
        aux = ( aux * fac[ n ] ) % MOD ;
        aux = ( aux * inv[ i ] ) % MOD ;
        aux = ( aux * inv[ n - i ] ) % MOD ;
        ans += aux ;
        if ( ans >= MOD ) { ans -= MOD ; }
    }
    printf ( "%lld\n" , ans ) ;
}


int main ( ) {
    ios_base :: sync_with_stdio ( false ) ;
    cin.tie ( NULL ) ;
    int t ;
    t = 1 ;
    // cin >> t ;
    // scanf ( "%d" , &t ) ;
    while ( t -- ) {
        input ( ) ;
        solve ( ) ;
    }
    return 0 ;
}

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)//iをaからn
#define per(i,n,a) for (int i=a-1;i>=n;i--)//iをnからa
#define db(x) cout << #x << " = " << x << endl//デバッグ用
#define db2(x, y) cout << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")\n"; //デバッグ用
#define all(x) (x).begin(), (x).end()
#define INF32 2147483647 //2.147483647×10^{9}:32bit整数のinf
#define INF64 9223372036854775807 //9.223372036854775807×10^{18}:64bit整数のinf
#define MOD 998244353 //10^9+7:合同式の法
#define pb push_back
#define F first
#define S second
typedef long long ll;
//sort(all(a)); ソート
//sort(all(a),greater<int>()); 逆順ソート
//a.erase(unique(all(a)), a.end()); ソート後に重複を削除
//cout<< std::fixed << std::setprecision(15)<<0.000001<<endl; 小数点以下を表示させる
//vector<vector<int>> data(3, vector<int>(4)); int型の2次元配列(3×4要素の)の宣言
//PNch[i]:=(iを割り切る最大の素数)
//但し,iが素数の時はPNch[i]=1,i=0,1の時はPNch[i]=0
vector<ll> PNch;

//n:=素因数分解したい中で最大の値(2以上)
void ES(ll n){
    //素数として初期化
    PNch.assign(n+1,1);
    PNch[0]=0;PNch[1]=0;
    ll l=sqrt(n);
    rep(i,2,l){
        //ある素数の倍数ならばその素数で割り切れる
        if(PNch[i]==1){
            rep(j,i,n/i)PNch[j*i]=i;
        }
    }
}

class PFmap{
public:
    //PNs:=(素因数分解出てくる素数を(昇順に)格納したmap)
    map<ll,ll> PNs;
    PFmap(ll n){PF(n);}
    void PF(ll n){
        if(n<=1) return;
        //nが素数の時
        if(PNch[n]==1){PNs[n]++;return;}
        //マークされている数は素数
        PNs[PNch[n]]++;
        //マークされている数でnを割った数
        PF(n/PNch[n]);
    }
};
const int MAX = 300000;
long long fac[MAX], finv[MAX], inv[MAX];

// テーブルを作る前処理
void COMinit() {
    fac[0] = fac[1] = 1;
    finv[0] = finv[1] = 1;
    inv[1] = 1;
    for (int i = 2; i < MAX; i++){
        fac[i] = fac[i - 1] * i % MOD;
        inv[i] = MOD - inv[MOD%i] * (MOD / i) % MOD;
        finv[i] = finv[i - 1] * inv[i] % MOD;
    }
}

// 二項係数計算
long long COM(ll n, ll k){
    if (n < k) return 0;
    if (n < 0 || k < 0) return 0;
    return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
}

int main() {
    ll N,M;
    cin >> N >>M;
    ll ans=1;
    
    if(M==1){
        cout<<ans;
        return 0;
    }
    if(N==1){
        cout<<M;
        return 0;
    }
    COMinit();
    ES(400000);
    rep(i,2,M+1){
        ll nowans=1;
        auto so=PFmap(i);
        //db(so.PNs.size());
        auto begin = so.PNs.begin(), end = so.PNs.end();
        //if(i==200000)db(so.PNs.size());
        
        for (auto iter = begin; iter != end; iter++) {
            ll aaa=iter->second;
        if(aaa == 1){
            nowans*=N;
            nowans%=MOD;
        }else{
            nowans*=COM(N+aaa-1,aaa);
            nowans%=MOD;
        }
        }
        //db(nowans);
        ans+=nowans;
        ans%=MOD;
    }
    cout<<ans;
    
    //cout<<ans<<endl;
    return 0;
}