#include <bits/stdc++.h>
#define all(a) (a).begin(), (a).end()
using namespace std;
using ll  = long long int;
using pii = pair<ll, ll>;
using vi = vector<ll>;
template <typename T> void out(const T& t) {cout << t << '\n';}
vi vin(int n) {vi res(n); for(auto&i:res)cin>>i; return res;}
ll in() {ll x; cin>>x; return x;}

const ll MOD = 998244353;
const int N = 2e5 + 5;
ll two[N];
ll twoinv = 499122177;

ll mmod(ll x, ll y) {
    if (x >= 0LL)
        return x % y;
    else
        return (y - (-x) % y) % y;
}
int lp[N+1], cnt[N+1][18];
ll facts[N+1], invfacts[N+1];
vector<int> pr;

ll binpow(ll x, ll n) {
    ll ans=1; ll cur=x;
    for (;n;n>>=1) {
        if (n&1) ans=ans*cur%MOD;
        cur=cur*cur%MOD;
    }
    return ans;
}

ll C(ll n, ll k) {
    if (n < 0 || k < 0) return 0;
    if (k > n) return 0;
    return facts[n] * invfacts[k] % MOD * invfacts[n - k] % MOD;
}

void solve() {
    facts[0]=1;
    for (int i = 1; i <= N; ++i) facts[i] = i * facts[i - 1] % MOD;
    for (int i = 0; i <= N; ++i) invfacts[i] = binpow(facts[i], MOD-2);
    for (int i = 0; i <= N; ++i) cnt[i][0]=1;
    for (int i=2; i<=N; ++i) {
        if (lp[i] == 0) {
            lp[i] = i;
            pr.push_back (i);
        }
        for (int j=0; j<(int)pr.size() && pr[j]<=lp[i] && i*pr[j]<=N; ++j) {
            lp[i * pr[j]] = pr[j];
        }
    }
    for (int i = 2; i <= N; ++i) {
        cnt[i][1] = 1;
        for (int j = 2; j * j <= i; ++j) {
            if (i % j == 0) {
                for (int k = 1; k <= 17; ++k) {
                    cnt[i][k] = (cnt[i][k] + cnt[i / j][k - 1]) % MOD;
                    if (i / j != j) cnt[i][k] = (cnt[i][k] + cnt[j][k - 1]) % MOD;
                }
            }
        }
    }
    ll ans = 0;
    int n = in(), m = in();
    for (int i = 1; i <= m; ++i) {
        ans;
        for (int j = 0; j <= 17; ++j) {
            ans = (ans + cnt[i][j]%MOD * C(n - 1, j)) % MOD;
        }
    }
    out(ans);
}

int main() {
    ios::sync_with_stdio(false);cin.tie(0);
    int t=1;;while(t--)solve();return 0;
}

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

const long mod=998244353;
const long Beneath=300000;

vector<long> fac(Beneath+1),ifac(Beneath+1);

long mpow(long x,long n){
  long ans=1;
  while(n!=0){
    if(n&1) ans=ans*x%mod;
    x=x*x%mod;
    n= n>>1;
  }
  return ans;
};

long comb(long a,long b){
  if(a==0 && b==0) return 1;
  if(a<b || a<0) return 0;
  long tmp=ifac.at(a-b)*ifac.at(b)%mod;
  return tmp*fac.at(a)%mod;
};

long perm(long a,long b){
  if(a==0 && b==0) return 1;
  if(a<b || a<0) return 0;
  return fac.at(a)*ifac.at(a-b)%mod;
};

void fermat(){
  fac.at(0)=1;ifac.at(0)=1;
  for(long i=1;i<Beneath+1;i++){
    fac.at(i)=fac.at(i-1)*i%mod;
    ifac.at(i)=ifac.at(i-1)*mpow(i,mod-2)%mod;
  }
};

vector<int> Eratosthenes(int N){
  vector<bool> prime(N+1,true);
  vector<int> P;
  for(int i=2;i<=N;i++){
    if(prime.at(i)){
      for(int j=i*2;j<=N;j+=i) prime.at(j)=false;
      P.push_back(i);//素数ならif内でPに追加され、vector:prime内の倍数はfalseとなる
    }
  }
  return P;
} 

int main(){
  int N,M;cin>>N>>M;
  fermat();
  vector<int> E=Eratosthenes(500);
  queue<int> q;
  vector<long> X(M+1,1);
  int k,cnt;long ret;
  for(int i=2;i<=M;i++){
    k=i;
    for(int e:E){
      if(k%e) continue;
      cnt=0;
      while(k%e==0){
        cnt++;
        k/=e;
      }
      q.push(cnt);
      if(k==1) break;
    }
    if(k!=1) q.push(1);
    ret=1;
    while(!q.empty()){
      k=q.front();q.pop();
      ret*=comb(N+k-1,k);
      ret%=mod;
    }
    X[i]=X[i-1]+ret;
    X[i]%=mod;
    //cout<<X[i]<<endl;
  }
  cout<<X[M]<<endl;
}