#include<bits/stdc++.h>

typedef long long int lli;
typedef long double lld;
typedef long long ll;
#define int long long
//Fast Input I/O
#define fio ios_base::sync_with_stdio(false), cin.tie(NULL);
//Datatype
#define vi vector<int>
#define vlli vector<long long int>
#define vvi vector<vector<int>>
#define vvlli vector<vector<long long int>>
#define ppi pair<int, int>
#define rppi pair<int, pair<int, int>>
#define lppi pair<pair<int, int>, int>
#define vppi vector<pair<int, int>>
#define sppi stack<pair<int int>>
#define qppi queue<pair<int, int>>
//function
#define f first
#define s second
#define pb(x) push_back(x)
#define mkp(i, j) make_pair(i, j)
#define lmkp(i,j,k) make_pair(make_pair(i,j),k)
#define rmkp(i,j,k) make_pair(i,make_pair(j,k))
//loop
#define loop(i,n) for (i = 0; i < n; ++i)
#define loops(i,k,n) for (i = k; i <= n; ++i)
#define looprev(i,k,n) for (i = k; i >= n; --i)
//Const
#define inf (int)1e9
#define eps 1e-9
#define PI 3.1415926535897932384626433832795
#define MOD 1000000007
//Print
#define prd(n) printf("%d", n)
#define prl(n) printf("%lld", n)
#define prdn(n) printf("%d\n", n)
#define prln(n) printf("%lld\n", n)
#define prf(n) printf("%f", n)
//Scan
#define scd(n) scanf("%d", &n)
#define scd2(a, b) scanf("%d %d", &a, &b)
#define scd3(a, b, c) scanf("%d %d %d", &a, &b, &c)
#define scl(n) scanf("%lld", &n)
#define scl2(a, b) scanf("%lld %lld", &a, &b)
#define scl3(a, b, c) scanf("%lld %lld %lld", &a, &b, &c)
#define scf(n) scanf("%f", &n)
#define all(x) (x).begin(), (x).end()
#define mod 998244353
const long long N = 200005;

using namespace std;

void online_judge() {
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
#endif
}

int power(int a, int b, int p)
{
	if (a == 0)
		return 0;
	int res = 1;
	a %= p;
	while (b > 0)
	{
		if (b & 1)
			res = (res * a) % p;
		b >>= 1;
		a = (a * a) % p;
	}
	return res;
}

vector<int> primes[N];
vector<int> f(2 * N, 0);
void process() {
	for (int i = 2; i < N; i++) {
		if (primes[i].size()) continue;
		for (int j = i; j < N; j += i) {
			primes[j].pb(i);
		}
	}

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

int inv(int a) {
	return power(a, mod - 2, mod);
}

int choose(int n , int r) {
	return (((f[n] * inv(f[n - r])) % mod) * inv(f[r])) % mod;
}

void solve() {
	process();
	int n, m;
	cin >> n >> m;
	int ans = 0;
	for (int i = 1; i <= m; i++) {
		int res = 1;
		for (auto j : primes[i]) {
			int cnt = n;
			int c = i;
			while (c > 0 && c % j == 0) {
				c /= j;
				cnt++;
			}
			res *= choose(cnt - 1, n - 1);
			res %= mod;
		}
		ans += res;
		ans %= mod;
	}
	cout << ans;
}

int32_t main() {
	fio;
	online_judge();
	lli t = 1;
	//cin >> t;
	while (t--) {
		solve();
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
#define deb(k) cerr << #k << ": " << k << "\n";
#define size(a) (int)a.size()
#define fastcin cin.tie(0)->sync_with_stdio(0);
#define st first
#define nd second
#define pb push_back
#define mk make_pair
#define int long long
typedef long double ldbl;
typedef double dbl;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef map<int, int> mii;
typedef vector<int> vint;
#define MAX 300100
#define MAXLG 20
const int inf = 0x3f3f3f3f;
const ll mod = 998244353;
const ll linf = 0x3f3f3f3f3f3f3f3f;
const int N = 300100;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
ll fat[MAX+100];
ll ifat[MAX+100];

ll power(ll x, ll y, ll p){
  ll res = 1;
  x = x % p;
  while (y > 0){
    if (y & 1) res = (res*x) % p;
    y = y>>1;
    x = (x*x) % p;
  }
  return res;
}

void init(){
	fat[0] = 1;
	fat[1] = 1;
	for(ll i=2;i<=MAX;i++){
	  fat[i] = (fat[i-1]*i)%mod;
	}
	ifat[MAX] = power(fat[MAX], mod-2, mod);
	for(ll i=MAX-1;i>=0;i--) ifat[i] = (ifat[i+1]*(i+1))%mod;
}

int choose(int x, int y){
	if(y < 0 || y > x || x < 0) return 0;
	return fat[x]*(ifat[y]*ifat[x-y]%mod)%mod;
}

int dp[N][20];
bool vis[N][20];
int n, m;

int sol(int x, int y){
	if(vis[x][y]) return dp[x][y];
	vis[x][y] = 1;
	int &c = dp[x][y];
	c = choose(n-1, y-1);
	for(int i=2;i<=m;i++){
		if(x*i > m) break;
		c = (c + sol(x*i, y+1))%mod;
	}
	return c;
}



void solve(){
	init();
	cin>>n>>m;
	int ans = 0;
	for(int i=1;i<=m;i++) ans = (ans + sol(i, 1))%mod;
	cout<<ans<<"\n";


	// Have you read the problem again?
	// Maybe you understood the wrong problem
}

int32_t main(){
	fastcin;
	int t_ = 1;
	//cin>>t_;
	while(t_--)
		solve();
	return 0;
}
