#include <iostream>
#include <vector>

using namespace std;

using ll = long long;

const ll MOD = 998244353;

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;
	}
	ll res = 1;
	for (ll i = n - k + 1; i <= n; ++i) {
		res = res * i % MOD;
	}
	ll res2 = 1;
	for (ll i = 1; i <= k; ++i) {
		res2 = res2 * i % MOD;
	}
	return res * inv(res2) % MOD;
}

int sol(ll n, ll k) {
	return cnk(n + k - 1, k);
}

int main() {
	int n, C;
	cin >> n >> C;
	vector<int> pr;
	vector<int> min_div_val(C + 1);
	vector<char> min_div_pow(C + 1);
	vector<int> prev(C + 1);
	for (int i = 2; i <= C; ++i) {
		if (!min_div_val[i]) {
			min_div_val[i] = i;
			min_div_pow[i] = 1;
			prev[i] = 1;
			pr.push_back(i);
		}
		for (int j = 0; j < static_cast<int>(pr.size()) && pr[j] <= min_div_val[i] && pr[j] * i <= C; ++j) {
			int new_val = pr[j] * i;
			min_div_val[new_val] = pr[j];
			if (pr[j] == min_div_val[i]) {
				min_div_pow[new_val] = min_div_pow[i] + 1;
				prev[new_val] = prev[i];
			} else {
				min_div_pow[new_val] = 1;
				prev[new_val] = i;
			}
		}
	}
	min_div_val.resize(0);
	min_div_val.shrink_to_fit();
	vector<int> ans(C + 1);
	ans[1] = 1;
	vector<int> calc(100);
	for (int i = 1; i <= 99; ++i) {
		calc[i] = sol(n, i);
	}
	for (int i = 2; i <= C; ++i) {
		ans[i] = calc[min_div_pow[i]] * 1ll * ans[prev[i]] % MOD;
	}
	ll res = 0;
	for (int i = 1; i <= C; ++i) {
		res += ans[i];
	}
	res %= MOD;
	cout << res;
	return 0;
}
