#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

#include <iostream>
#include <vector>

using namespace std;

using ll = long long;

const ll MOD = 998244353;

const int MAX_C = 2e6;

ll fact[MAX_C + 1], inv_fact[MAX_C + 1];

ll bin_pow(ll a, ll p) {
	if (!p) {
		return 1;
	}
	if (p & 1) {
		return bin_pow(a, p - 1) * a % MOD;
	} else {
		ll x = bin_pow(a, p / 2);
		return x * x % MOD;
	}
}

ll inv(ll x) {
	return bin_pow(x, MOD - 2);
}

ll cnk(ll n, ll k) {
	if (n < 0 || k < 0 || n - k < 0) {
		return 0;
	}
	return fact[n] * inv_fact[k] % MOD * inv_fact[n - k] % MOD;
}

void init() {
	fact[0] = 1;
	for (int i = 1; i <= MAX_C; ++i) {
		fact[i] = fact[i - 1] * i % MOD;
	}
	inv_fact[MAX_C] = inv(fact[MAX_C]);
	for (int i = MAX_C - 1; i >= 0; --i) {
		inv_fact[i] = inv_fact[i + 1] * (i + 1) % MOD;
	}
}

int main() {
	init();
	int n, C;
	cin >> n >> C;
	vector<vector<int>> divisors(C + 1);
	for (int i = 1; i <= C; ++i) {
		for (int j = i + i; j <= C; j += i) {
			divisors[j].push_back(i);
		}
	}
	int cnt = 1;
	int pow = 1;
	while (pow <= C) {
		pow *= 2;
		++cnt;
	}
	vector<vector<ll>> dp(cnt + 1, vector<ll>(C + 1));
	for (int i = 1; i <= C; ++i) {
		dp[1][i] = 1;
	}
	ll ans = 0;
	for (int len = 1; len + 1 <= cnt; ++len) {
		for (int i = 1; i <= C; ++i) {
			for (int j : divisors[i]) {
				dp[len + 1][i] += dp[len][j];
				if (dp[len + 1][i] >= MOD) {
					dp[len + 1][i] -= MOD;
				}
			}
		}
	}
	for (int len = 1; len <= cnt; ++len) {
		for (int i = 1; i <= C; ++i) {
			ans = (ans + cnk(n - 1, len - 1) * dp[len][i]) % MOD;
		}
	}
	cout << ans;
	return 0;
}
