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

template<typename T>
void out(T x) { cout << x << endl; exit(0); }
#define watch(x) cout << (#x) << " is " << (x) << endl





using ll = long long;


const int maxn = 1e6 + 5;
const ll mod = 998244353;

ll fac[maxn], ifac[maxn], inv[maxn];

ll nck(ll n, ll k) {
    //cout<<"nck: "<<n<<" "<<k<<endl;
    
    if (n<k) return 0;
    return fac[n]*ifac[k]%mod*ifac[n-k]%mod;
}

void gen_inv() {
    fac[0]=inv[0]=ifac[0]=1;
    fac[1]=inv[1]=ifac[1]=1;

    for (int i=2; i<maxn; i++) {
	fac[i]=fac[i-1]*i%mod;
	inv[i]=(mod-(mod/i)*inv[mod%i]%mod)%mod;
	ifac[i]=ifac[i-1]*inv[i]%mod;
    }
}


void add(ll &x, ll y) {
    x %= mod;
    y %= mod;
    x += y;
    x %= mod;
}


ll brute(ll N, ll M) {
    vector<ll> dp(M+1, 0);
    dp[1] = 1;


    for (int it=0; it<N; it++) {
	vector<ll> ndp(M+1, 0);
	for (int i=1; i<=M; i++) {
	    for (int j=1; j<=i; j++) {
		if (i%j==0) {
		    add(ndp[i], dp[j]);
		}
	    }
	}
	dp = ndp;
    }

    ll res = 0;
    for (ll x: dp) {
	add(res, x);
    }
    return res;
}


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


int main() {
    ios_base::sync_with_stdio(false); cin.tie(0);  cout.tie(0);

    gen_inv();

    ll N, M;
    cin>>N>>M;


    ll res = 0;
    
    // iterate over last element
    for (int i=1; i<=M; i++) {
	ll bins = N;
	ll cur = 1;
	auto pf = count_pf(i);
	for (ll balls: pf) {
	    cur *= nck(bins-1+balls, balls);
	    cur %= mod;
	}
	//cout<<i<<":"<<cur<<endl;
	add(res, cur);
    }

    //assert(res==brute(N,M));

    out(res);
    return 0;
}

#include<bits/stdc++.h>
#define ll long long int
#define pll pair<ll,ll>
#define vpll vector< pll >
#define mpll map<ll,ll>
#define MOD 998244353
#define all(v) v.begin(),v.end()
#define s(v) v.size()
#define test ll t;cin>>t;while(t--)
#define vec vector<ll>
#define read0(v,n) for(int i=0;i<n;i++)cin>>v[i];
#define read1(v,n) for(int i=1;i<=n;i++)cin>>v[i];
#define trav(a,x) for (auto& a: x)
#define fast ios_base::sync_with_stdio(false);cin.tie(NULL);
#define cut(x) {cout<<x;return 0;}
#define print(x) {cout<<x<<nl;continue;}
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FORB(i,a,b) for(int i=a;i>=b;i--)
#define err1(a) {cout<<#a<<' '<<a<<nl;}
#define err2(a,b) {cout<<#a<<' '<<a<<' '<<#b<<' '<<b<<nl;}

#define mp make_pair
#define pb push_back
#define eb emplace_back
#define f first
#define sc second
#define lb lower_bound
#define ub upper_bound
#define nl '\n'
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace __gnu_pbds;
using namespace std;
#define oset tree<int, null_type,less_equal<int>, rb_tree_tag,tree_order_statistics_node_update>
ll gcd(ll a, ll b)
{
	if (b==0)return a;
	return gcd(b, a % b);
}
ll lcm(ll a,ll b)
{
    return (a*b)/gcd(a,b);
}
ll bpow(ll a, ll b)
{
	ll ans=1;
	while(b)
	{
		if(b&1)
			ans=(ans*a)%MOD;
		b/=2;
		a=(a*a)%MOD;
	}
	return ans;
}
mpll factorise(ll n)
{
    mpll fact;
    while (n % 2 == 0)
    {
        fact[2]++;
        n = n/2;
    }

    // n must be odd at this point. So we can skip
    // one element (Note i = i +2)
    for (int i = 3; i <= sqrt(n); i = i + 2)
    {
        // While i divides n, print i and divide n
        while (n % i == 0)
        {
           fact[i]++;
            n = n/i;
        }
    }

    // This condition is to handle the case when n
    // is a prime number greater than 2
    if (n > 2)
        fact[n]++;
    return fact;
}
const int N=1e6;
ll fac[N];
void precompute()
{
    fac[0]=1;
    FOR(i,1,(ll)5e5)fac[i]=(i*fac[i-1])%MOD;
}
ll ncr(ll n,ll r)
{
    return (((fac[n]*bpow(fac[r],MOD-2))%MOD)*(bpow(fac[n-r],MOD-2)))%MOD;
}

int main()
{
	#ifndef ONLINE_JUDGE
    	freopen("input.txt", "r", stdin);
    	freopen("output.txt", "w", stdout);
    	#endif

	fast
	ll n,m;
	cin>>n>>m;
	precompute();
	ll sum=0;
	FOR(i,1,m)
	{
	    mpll temp=factorise(i);
	    ll x=1;
	    trav(it,temp)
	    {
	        x=(x*ncr(n+it.sc-1,n-1))%MOD;
	    }
	    sum=(sum+x)%MOD;
	}
	cut(sum)




}
