#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define DEBUG(x) cout << '>' << #x << ':' << x << endl;
#define REP(i,n) for(ll i=0;i<(n);i++)
#define FOR(i,a,b) for(ll i=(a);i<(b);i++)
#define FORC(i,a,b,c) for(ll i=(a);i<(b);i+=(c))
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define ff first
#define ss second
#define dd long double
#define all(x) x.begin(),x.end()
template<ll MOD = 998244353>
struct mint{
    ll x;
    ll mod = MOD;
    mint(ll x=0):x(x%MOD){}
    mint& operator+=(const mint a){
        if((x+=a.x)>=MOD) x-=MOD;
        return *this;
    }
    mint& operator-=(const mint a){
        if((x += MOD-a.x)>=MOD) x-=MOD;
        return *this;
    }
    mint& operator*=(const mint a){
        (x*=a.x)%=MOD;
        return *this;
    }
    mint operator+(const mint a) const{
        mint res(*this);
        return res+=a;
    }
    mint operator-(const mint a) const{
        mint res(*this);
        return res-=a;
    }
    mint operator*(const mint a) const{
        mint res(*this);
        return res*=a;
    }
    mint power(ll t) const{
        if(!t) return 1;
        mint a = power(t>>1);
        a*=a;
        if(t&1) a*=*this;
        return a;
    }

    mint inv() const{
        return power(MOD-2);
    }
    mint& operator/=(const mint a){
        return (*this) *= a.inv();
    }
    mint operator/(const mint a) const{
        mint res(*this);
        return res/=a;
    }
};
template<ll mod>
ostream & operator << (ostream & output,const mint<mod> & a){
        output<<a.x;
        return output;
}
template<ll mod>
istream & operator >> (istream & input, mint<mod>& a){
        input>>a.x;
        return input;
}

using mll=mint<>;
template <typename T>
ostream& operator<<(ostream& os, const vector<T>& v){
    os << "[";
    for (ll i=0; i < v.size(); ++i) {
        os << v[i];
        if (i != v.size() - 1)
            os << ", ";
    }
    os << "]";
    return os;
}
template <typename T>
ostream& operator<<(ostream& os, const set<T>& v){
    os << "{";
    for (auto it : v) {
        os << it;
        if (it != *v.rbegin())
            os << ", ";
    }
    os << "}";
    return os;
}
template <typename T, typename S>
ostream& operator<<(ostream& os, const map<T, S>& v){
    os<<"{";
    for (auto it : v){
        os << it.first << " : "
           << it.second ;
        if (it != *v.rbegin())
            os << ", ";
    }
    os << "}";
    return os;
}
template <typename T, typename S>
ostream& operator<<(ostream& os, const pair<T, S>& v){
    os << "(";
    os << v.first << ", "
       << v.second << ")";
    return os;
}
const ll N=4e5+10;
mll fact[N+1];
mll ifact[N+1];

void init(){
    fact[0]=fact[1]=1;
    FOR(i,2,N+1){
        fact[i]=fact[i-1]*i;
    }
    ifact[0]=1;
    ifact[1]=1;
    ifact[1]/=1;
    FOR(i,2,N+1){
        ifact[i]=1;
        ifact[i]/=i;
        ifact[i]*=ifact[i-1];
    }
}

mll pnc(ll n, ll r){
    mll a=fact[n];
    a*=ifact[r];
    a*=ifact[n-r];
    return a;
}

ll spf[N];

void spfe(){
    for(ll i=1;i<=N;i++){
        spf[i]=i;
    }
    for(ll i=4;i<=N;i+=2){
        spf[i]=2;
    }
    for(ll i=2;i*i<=N;i++){
        if(spf[i]==i){
            for(ll j=i*i;j<=N;j+=i){
                if(spf[j]==j){
                    spf[j]=i;
                }
            }
        }
    }
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    init();
    spfe();
    ll n,m;
    cin>>n>>m;
    vector<ll> dp(N);
    for(ll i=1;i<N;i++){
        for(ll j=2*i;j<N;j+=i){
            dp[j]++;
        }
    }
    mll ans=0;
    for(ll i=1;i<=m;i++){
        ll nn=i;
        vector<ll> prods;
        while(nn!=1){
            ll x=spf[nn];
            ll temp=1;
            while(nn%x==0){
                nn/=x;
                temp*=x;
            }
            prods.pb(temp);
        }
        mll tempo=1;
        for(auto & x:prods){
            tempo*=pnc(dp[x]+n-1,n-1);
        }
        ans+=tempo;
    }
    cout<<ans<<endl;

}

#include <bits/stdc++.h>

using namespace std;

#define ll int64_t

const int mod = 998244353;
int inc(int x, int y) { return x + y >= mod ? x + y - mod : x + y; }

vector<int> mult(vector<int> &a, vector<int> &b)
{
    vector<int> tmp(a.size());
    for (int i = 1; i < a.size(); i++)
    {
        for (int j = i; j < a.size(); j += i)
        {
            tmp[j] = inc(tmp[j], 1ll * a[i] * b[j / i] % mod);
        }
    }
    return tmp;
}
vector<int> qpow(vector<int> a, int x)
{
    vector<int> res(a.size());
    res[1] = 1;
    while (x)
    {
        if (x & 1)
            res = mult(res, a);
        a = mult(a, a);
        x >>= 1;
    }
    return res;
}
void solve()
{
    int n, m;
    cin >> n >> m;
    vector<int> dp(m + 1, 1);

    dp = qpow(dp, n);
    int ans = 0;
    for (int i = 1; i <= m; i++)
        ans = inc(ans, dp[i]);
    cout << ans << endl;
}

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

    while (T--)
    {
        solve();
    }
}