/*** keep hungry and calm CoolGuang!  ***/
//#pragma GCC optimize(3)
#include <bits/stdc++.h>
#include<stdio.h>
#include<queue>
#include<algorithm>
#include<string.h>
#include<iostream>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define dl(x) printf("%lld\n",x);
#define di(x) printf("%d\n",x);
#define all(s) s.begin(),s.end()
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const ll INF= 1e16+7;
const int maxn = 1e6+700;
const int mod= 998244353;
const double eps = 1e-9;

const double PI = acos(-1);
template<typename T>inline void read(T &a){char c=getchar();T x=0,f=1;while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}a=f*x;}
ll n,m;
int prime[maxn],vis[maxn];
int cnt = 0;
ll fac[maxn];
ll qpow(ll a,ll b)
{
    ll ans=1;
    while(b){
        if(b&1)ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }return ans;
}
ll cal(int m,int n)
{
    if(m<n) return 0;
    return fac[m]*qpow(fac[m-n],mod-2)%mod*qpow(fac[n],mod-2)%mod;
}
int mx[maxn];
map<ll,int>mp;
void SetPrime(){
	for(int i=2;i<=200000;i++){
		if(!vis[i]){
			prime[++cnt] = i;
			mx[i] = i;
			for(int k=i*2;k<=200000;k+=i){
				vis[k] = 1;
				mx[k] = i;
			}
		}
	}
}
int main(){
	SetPrime();
	fac[0] = 1;
	for(int i=1;i<=500000;i++) fac[i] = (fac[i-1]*i)%mod;
	read(n);read(m);
	ll ans = 0;
	for(int i=1;i<=m;i++){
		ll tmp = i,res = 1,pre = mx[tmp],c = 0;
		while(tmp != 1){
			if(mx[tmp]!=pre){
				res = (res * cal(n+c-1,c))%mod;
				c = 1;
			}else c++;
			pre = mx[tmp];
			tmp /= mx[tmp];
		}
		res = (res * cal(n+c-1,c))%mod;
		ans = (ans + res)%mod;
	}
	dl(ans);
  return 0;	
}
/***
***/
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair <long long, long long> pll;

ll mod = 998244353;
ll dp[200001][18];

void countWays(ll n, ll m)
{


    for (int i = 0; i <= n; i++) {
        dp[1][i] = 1;
    }

    ll sum;

    for (int i = 2; i <= m; i++) {
        for (int j = 0; j <= n; j++) {
            sum = 0;

            for (int k = 0; k <= j; k++) {
                sum += dp[i - 1][k], sum %= mod;
            }

            dp[i][j] = sum;
        }
    }

}

int main(){

  ios_base::sync_with_stdio(false);
  cin.tie(0);


    ll n, m;
    cin >> n >> m;

    countWays(17, n);

    ll bn = 1;

    for (int i = 2; i <= m; i++){

        ll brp = 0;
        ll tbn = 1;
        ll t = i;

        for (int j = 2; j <= sqrt(i); j++){
            ll btr = 0;
            while (t%j == 0)
             btr++, t/=j;
            if (btr > 0)
             tbn *= dp[n][btr], tbn %= mod;
        }

        if (t > 1)
            tbn *= n, tbn %= mod;

        bn += tbn, bn%= mod;

    }
    //cout << dp[n][2] << endl;


    cout << bn;

}
