#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef double lf;
#define Rl(x) scanf ("%lld", &x)
#define Ri(x) scanf ("%d", &x)
#define Rf(x) scanf ("%lf", &x)
const int maxn = 2e5 + 5, mod = 998244353;
int n, m; LL a[maxn], tmp[maxn], ans[maxn];
inline void D(LL *a, LL *b) {
    memset(tmp, 0, sizeof tmp);
    for (int i = 1; i <= m; ++i) {
        for (int j = 1; j <= m / i; ++j)
            tmp[i * j] = (tmp[i  * j] + a[i] * b[j] % mod) % mod;
    }
    memcpy(a, tmp, sizeof tmp);
}

void work() {
    for (int i = 1; i <= m; ++i) a[i] = 1;
    ans[1] = 1;
    while (n) {
        if (n & 1) D(ans, a);
        D(a, a);
        n >>= 1;
    }
    for (int i = 1; i <= m; ++i) ans[i] = (ans[i - 1] + ans[i]) % mod;
}

int main() {
    Ri(n); Ri(m);
    work();
    cout << ans[m] << endl;
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
namespace IO
{
    const int buf_size=1<<20;
    char buf[buf_size],*S,*T;
    inline char read_char()
    {
        if(S==T)
            T=(S=buf)+fread(buf,1,buf_size,stdin);
        return S!=T?*(S++):EOF;
    }
    bool flag_EOF;
    inline int read_int()
    {
        char c=read_char();
        bool neg=false;
        while(c<'0'||c>'9')
        {
            if(c==EOF)
            {
                flag_EOF=true;
                return 0;
            }
            neg=(c=='-');
            c=read_char();
        }
        int x=0;
        while(c>='0'&&c<='9')
        {
            x=x*10+(c^48);
            c=read_char();
        }
        return neg?-x:x;
    }
    inline void read_string(char *s)
    {
        char c=read_char();
        while(c<'a'||c>'z')
        {
            if(c==EOF)
            {
                flag_EOF=true;
                return;
            }
            c=read_char();
        }
        while(c>='a'&&c<='z')
        {
            *(s++)=c;
            c=read_char();
        }
        *s='\0';
    }
    inline double read_double()
    {
        char c=read_char();
        bool neg=false;
        while(c<'0'||c>'9')
        {
            if(c==EOF)
            {
                flag_EOF=true;
                return 0;
            }
            neg=(c=='-');
            c=read_char();
        }
        double x=0;
        while(c>='0'&&c<='9')
        {
            x=x*10+(c^48);
            c=read_char();
        }
        if(c=='.')
        {
            c=read_char();
            double eps=1;
            while(c>='0'&&c<='9')
            {
                eps*=0.1;
                x+=eps*(c^48);
                c=read_char();
            }
        }
        return neg?-x:x;
    }
    char fw[buf_size];
    int pw;
    inline void flush()
    {
        fwrite(fw,1,pw,stdout);
        pw=0;
    }
    inline void write_char(char x)
    {
        if(pw==buf_size)
            flush();
        fw[pw++]=x;
    }
    char st[26];
    int top;
    inline void write_int(int x)
    {
        if(!x)
        {
            write_char('0');
            return;
        }
        if(x<0)
        {
            write_char('-');
            x=-x;
        }
        while(x)
        {
            st[++top]=x%10^48;
            x/=10;
        }
        while(top>0)
            write_char(st[top--]);
    }
    inline void write_string(const char *s)
    {
        for(int i=0;s[i];++i)
            write_char(s[i]);
    }
    inline void write_double(double x,int cnt_digits,bool mark=true)
    {
        if(x<0)
        {
            write_char('-');
            x=-x;
        }
        if(mark)
            x+=5*pow(0.1,cnt_digits+1);
        write_int(int(x));
        if(cnt_digits>0)
        {
            write_char('.');
            for(int i=1;i<=cnt_digits;++i)
            {
                x-=int(x),x*=10;
                write_char(int(x)^48);
            }
        }
    }
}
const int mod=998244353;
const int max_n=4e5+5;
int fac[max_n],inv[max_n],inv_fac[max_n];
inline void init(int n=4e5)
{
	fac[0]=inv_fac[0]=1;
	fac[1]=inv[1]=inv_fac[1]=1;
	for(int i=2;i<=n;++i)
	{
		fac[i]=1ll*fac[i-1]*i%mod;
		inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
		inv_fac[i]=1ll*inv_fac[i-1]*inv[i]%mod;
	}
}
inline int C(int n,int m)
{
	if(n<0||m<0||n<m)
		return 0;
	return 1ll*fac[n]*inv_fac[m]%mod*inv_fac[n-m]%mod;
}
int ans;
vector<int> cnt;
int N,M;
inline void solve(int x)
{
	cnt.clear();
	for(int i=2;1ll*i*i<=x;++i)
	{
		if(x%i==0)
		{
			int c=0;
			while(x%i==0)
				x/=i,++c;
			cnt.push_back(c);
		}
	}
	if(x!=1)
		cnt.push_back(1);
	int res=1;
	for(int i=0;i<int(cnt.size());++i)
	{
		int x=cnt[i];
		res=1ll*res*C(N+x-1,N-1)%mod;
	}
	ans=(ans+res)%mod;
}
int main()
{
	init();
	scanf("%d%d",&N,&M);
	for(int i=1;i<=M;++i)
		solve(i);
	printf("%d\n",ans);
    IO::flush();
    return 0;
}
