#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstring>
#include<map>
#include<set>
#include<cstdlib>
#include<bitset>
using namespace std;
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
typedef int ll;
ll n,m;
ll cnt=0;
long long ans=0;
long long mod=998244353;
ll a[32]={0};
ll b[32]={0};
void dfs(ll su,ll num)
{
	if(su*5>n)
    {
      if(su*4<=n)
	      b[num]++,b[num+1]+=3,b[num+2]++;
      else if(su*3<=n) b[num]++,b[num+1]+=2;
      else if(su*2<=n) b[num]++,b[num+1]++;
      else b[num]++;
      return;
    }
	b[num]++;
	for(ll i=2*su;i<=n;i+=su)
	{
		dfs(i,num+1);
	}
}
long long qpow(long long a,long long b)
{
	if(b==0) return 1;
	long long c=qpow(a,b/2);
	if(b%2==0) return c*c%mod;
	else return c*c%mod*a%mod;
}
long long jie[200005]={0};
int main(void)
{
	scanf("%d%d",&m,&n);
	for(ll i=1;i<=n;i++)
	{
		ll cnt=1;
		memset(b,0,sizeof(b));
		dfs(i,1);
		while(n/i==(n/(i+1))) cnt++,i++;
		for(ll j=0;j<32;j++) a[j]+=b[j]*cnt;
	}
	ll ans=0;
	jie[0]=1;
	for(ll i=1;i<=m;i++) jie[i]=jie[i-1]*(long long)i%(long long)mod;
	for(long long i=1;i<=min(m,30);i++)
	{
		ans=(ans+a[i]*jie[m-1]%mod*qpow(jie[i-1]*jie[m-i]%mod,mod-2)%mod)%mod;
	}
	cout<<ans;
}
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define f first
#define s second
#define all(v) (v).begin(),(v).end()
#define rall(v) (v).rbegin(),(v).rend()

const int inf = 1e9;
const ll infll = 1e18;
const int M = 998244353;
const int N = 2e5;

int fact[N+1], inv[N+1];

int ad(ll a, ll b){
	return (a + b)%M;
}
int mul(ll a, ll b){
	return(a*b)%M;
}
int fp(int a , int b){
	int ret = 1;
	while(b){
		if(b&1) ret = mul(ret , a);
		b >>= 1;
		a = mul(a , a);
	}
	return ret;
}

int ch(int n , int k){
	if(k > n)return 0;
	return mul(fact[n], mul(inv[n-k], inv[k]));
}
void testCase(){
	int n , m, ans = 0;
	scanf("%d%d", &n, &m);
	vector<int> dp(m+1,1);
	for (int k = 1; k <= 20; ++k){
		vector<int> newDp(m+1, 0);
		int tmp = 0;
		for (int i = 1; i <= m; ++i){
			for (int j = i*2; j <= m; j += i){
				newDp[j]= ad(newDp[j], dp[i]);
			}
			tmp = ad(tmp, dp[i]);
		}
		ans = ad(ans, mul(ch(n-1, k-1), tmp));
		dp = newDp;
	}
	printf("%d\n", ans);
}

int main(){
	fact[0] = inv[0] = 1;
	for (int i = 1; i <= N; ++i){
		fact[i] = mul(i , fact[i-1]);
		inv[i] = fp(fact[i], M - 2);
	}
	//cout << ch(5, 0) << endl;
	int T = 1;
	//scanf("%d", &T);
	for (int tt = 1; tt <= T; ++tt){
		testCase();
	}
}