#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
#include <unordered_map>
#include <map>
#include <algorithm>
#define int long long
inline int read()
{
    int num=0,f=1;char c=getchar();
    while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
    while(c>47&&c<58)num=(num<<3)+(num<<1)+(c^48),c=getchar();
    return num*f;
}
const int mod=998244353;
int dp[200005][25];
inline int min(int a,int b){return a<b?a:b;}
inline int max(int a,int b){return a>b?a:b;}

int C[200005];
int dfs(int v,int qwq,int n,int m)
{
    if(qwq>n)return 0;
    if(dp[v][qwq])return dp[v][qwq];
    int ans=C[qwq-1];
    for(int i=qwq?2:1;i<=m;i++)
    {
        if(v*i>m)break;
        ans=(ans+dfs(v*i,qwq+1,n,m))%mod;
    }
    return dp[v][qwq]=ans;
    /*if(mp[x].count(y))return mp[x][y];
    //if(x==0)return mp[x][y]=1;
    if(x==1)return m/y-1+f;
    int ans=0;
    for(int i=2-f;i*y<=m;i++)ans+=dfs(x-1,y*i,m),ans%=mod;
    return mp[x][y]=ans%mod;
    return ans%mod;*/
}
inline int qp(int x,int p)
{
    int res=1;
    while(p)
    {
        if(p&1)res=res*x%mod;
        x=x*x%mod;
        p>>=1;
    }
    return res;
}
signed main()
{
    int n=read(),m=read(),ans=0;
    C[0]=1;
    for(int i=1;i<=n-1;i++)C[i]=C[i-1]*(n-i)%mod*qp(i,mod-2)%mod;
    //for(int i=1;i<=18;i++)
    //{ans+=dfs(i,1,m,1)*C[i-1]%mod;for(int i=1;i<=n;i++)mp[i].clear();}
    /*for(int i=1;i<=n;i++)
    {
        ans=(ans+mp[i][m]*qp(i,n-i))%mod;
    }*/
    printf("%lld\n",dfs(1,0,n,m));
    //printf("%lld\n",dfs(n,1,m));
}
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int mod = 998244353;
const int N = 2e5 + 200;

int n, m;
int factorial[N], invfac[N];

int power(int base, int expo) {
	int res = 1;

	while(expo) {
		if(expo & 1) {
			res = (res * base) % mod;
		}

		base = (base * base) % mod;
		expo /= 2;
	}

	return res;
}

int modInverse(int num) {
	return power(num, mod - 2);
}

int nCr(int n, int r) {
	int num = factorial[n];
	int den = invfac[n - r] * invfac[r];
	den %= mod;

	int ans = (num * den) % mod;

	return ans;
}

int solve() {
	cin >> n >> m;

	int ans = 0;

	for(int i = 1; i <= m; i++) {
		int curr = 1;

		int num = i;

		for(int j = 2; j * j <= num; ++ j) {
			int count = 0;
			while(num % j == 0) {
				num /= j;
				++ count;
			}

			curr *= nCr(n + count - 1, count);
			curr %= mod;
		}

		if(num > 1) {
			curr *= n;
			curr %= mod;
		}

		ans += curr;
		ans %= mod;
	}

	return ans;
}

signed main() {
	#ifndef ONLINE_JUDGE
	    // for getting input from input.txt
		freopen("input.txt", "r", stdin);
	    // for writing output to output.txt
	    //this can be opted out if you want to print the output to the sublime console
		freopen("output.txt", "w", stdout);
	#endif

	factorial[0] = 1;

	for(int i = 1; i < N; i++) {
		factorial[i] = factorial[i - 1]  * i;
		factorial[i] %= mod;
	}

	invfac[N - 1] = modInverse(factorial[N - 1]) % mod;

	for(int i = N - 2; i >= 0; -- i) {
		invfac[i] = invfac[i + 1] * (i + 1);
		invfac[i] %= mod;
	}

	cout << solve();

	return 0;
}