#include<algorithm>
#include<cstdio>
#define MaxN 200500
#define ll long long
using namespace std;
const int mod=998244353;
ll powM(ll a,int t=mod-2){
  ll ret=1;
  while(t){
    if (t&1)ret=ret*a%mod;
    a=a*a%mod;t>>=1;
  }return ret;
}
ll fac[MaxN],ifac[MaxN];
ll C(int n,int m)
{return fac[n]*ifac[m]%mod*ifac[n-m]%mod;}
void Init(int n)
{
  fac[0]=1;
  for (int i=1;i<=n;i++)
    fac[i]=fac[i-1]*i%mod;
  ifac[n]=powM(fac[n]);
  for (int i=n;i;i--)
    ifac[i-1]=ifac[i]*i%mod;
}
int d[MaxN][22];
void sieve(int n)
{
  for (int i=1;i<=n;i++){
    d[i][1]=1;
    for (int j=i+i;j<=n;j+=i)
      for (int k=1;k<20;k++)
        d[j][k+1]=(d[j][k+1]+d[i][k])%mod;
  }
}
ll buf[22];
int n,m;
int main()
{
  scanf("%d%d",&n,&m);
  Init(n+20);sieve(m);
  ll ans=0;
  for (int k=1;k<=min(20,n);k++)buf[k]=C(n-1,k-1);
  for (int i=1;i<=m;i++)
    for (int k=1;k<=min(20,n);k++)
      ans=(ans+d[i][k]*buf[k])%mod;
  printf("%lld",ans);
  return 0;
}

#include <bits/stdc++.h>          
using namespace std;
using ll = long long;
using ld = long double;
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define repp(i, st, en) for (ll i = (ll)st; i < (ll)(en); i++)
#define repm(i, st, en) for (ll i = (ll)st; i >= (ll)(en); i--)
#define all(v) v.begin(), v.end()
void chmax(ll &x, ll y) {x = max(x,y);}
void chmin(ll &x, ll y) {x = min(x,y);}
void Yes() {cout << "Yes" << endl; exit(0);}
void No() {cout << "No" << endl; exit(0);}
template<class in_Cout> void Cout(in_Cout x) {cout << x << endl; exit(0);}
template<class in_vec_cout>
void vec_cout(vector<in_vec_cout> vec) {
    for (in_vec_cout res : vec) {cout << res << " ";}
    cout << endl;
}

const ll inf = 1e18;
const ll mod = 998244353;

// nCr (mod p) 計算量 O(3*10^5*logp)
const ll Maximum = 3e5;
ll Fac[Maximum], iFac[Maximum];
bool made_Fac = false;
// x^n (mod p) 計算量 O(logn)
ll powmodp(ll x, ll n) {
    if (n==0) return 1;
    else if (n%2==0) {
        ll ans = powmodp(x,n/2);
        return ans*ans % mod;
    }
    else return x * powmodp(x,n-1) % mod;
}
// nCr (mod p) 計算量 O(3*10^5*logp)
void make_Fac() {
    Fac[0] = 1;
    iFac[0] = 1;
    for (ll i=0; i<Maximum; i++) {
        Fac[i+1] = Fac[i] * (i+1) % mod;
        iFac[i+1] = iFac[i] * powmodp(i+1,mod-2) % mod;
    }
}
ll nCrmodp(ll n, ll r) {
    if (!made_Fac) {
        make_Fac();
        made_Fac = true;
    }
    r = min(r,n-r);
    if (n==0 or r==0) return 1;
    ll tmp = iFac[n-r] * iFac[r] % mod;
    return tmp * Fac[n] % mod;
}

vector<ll> prime_counter(ll N) {
    vector<ll> res;
    for (ll i=2; i*i<=N; i++) {
        if (N%i) continue;
        ll cnt = 0;
        while (N%i==0) {cnt++; N/=i;}
        res.push_back(cnt);
    }
    if (N!=1) res.push_back(1);
    return res;
}

int main() {
    ll N, M; cin >> N >> M;

    ll ans = 0;
    for (ll i=1; i<=M; i++) {
        vector<ll> div = prime_counter(i);
        ll add = 1;
        for (ll cnt : div) {
            ll tmp = nCrmodp(cnt+N-1,N-1);
            add = add * tmp % mod;
        }
        ans = (ans + add) % mod;
    }

    cout << ans << endl;
}