#include <bits/stdc++.h>
#define int long long
using namespace std;
const int MOD = 998244353;
vector<int> prime((int)1e6 + 1, 1);
void solve(){
int n, m;
cin >> n >> m;
auto bin = [&](int a, int b, auto && self) -> int {
a %= MOD;
if(b == 0)return 1;
int g = self(a, b / 2, self);
g *= g;
g %= MOD;
if(b % 2)g *= a;
g %= MOD;
return g;
};
int ans = 0;
int prev = 1;
for(int i = 1; i <= n; i++){
ans += bin(m, i, bin);
ans %= MOD;
}
int cur = 1;
for(int i = 1; i <= n; i++){
if(prime[i]){
cur *= i;
if(cur > m)break;
}
int g = m / cur;
g %= MOD;
prev *= g;
prev %= MOD;
ans -= prev;
if(ans < 0)ans += MOD;
ans %= MOD;
}
cout << ans << "\n";
}
int32_t main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
// cin >> t;
for(int i = 2; i <= 1e6; i++){
if(!prime[i])continue;
for(int j = i * i; j <= 1e6; j += i)prime[j] = 0;
}
for(int i = 1; i <= t; i++){
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgaW50IGxvbmcgbG9uZwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBNT0QgPSA5OTgyNDQzNTM7CnZlY3RvcjxpbnQ+IHByaW1lKChpbnQpMWU2ICsgMSwgMSk7CnZvaWQgc29sdmUoKXsKCWludCBuLCBtOwoJY2luID4+IG4gPj4gbTsKCQoJYXV0byBiaW4gPSBbJl0oaW50IGEsIGludCBiLCBhdXRvICYmIHNlbGYpIC0+IGludCB7CgkJYSAlPSBNT0Q7CgkJaWYoYiA9PSAwKXJldHVybiAxOwoJCWludCBnID0gc2VsZihhLCBiIC8gMiwgc2VsZik7CgkJZyAqPSBnOwoJCWcgJT0gTU9EOwoJCWlmKGIgJSAyKWcgKj0gYTsKCQlnICU9IE1PRDsKCQlyZXR1cm4gZzsKCX07CgkKCWludCBhbnMgPSAwOwoJaW50IHByZXYgPSAxOwoJZm9yKGludCBpID0gMTsgaSA8PSBuOyBpKyspewoJCWFucyArPSBiaW4obSwgaSwgYmluKTsKCQlhbnMgJT0gTU9EOwoJfQoJaW50IGN1ciA9IDE7Cglmb3IoaW50IGkgPSAxOyBpIDw9IG47IGkrKyl7CgkJaWYocHJpbWVbaV0pewoJCQljdXIgKj0gaTsKCQkJaWYoY3VyID4gbSlicmVhazsKCQl9CgkKCQlpbnQgZyA9IG0gLyBjdXI7CgkJZyAlPSBNT0Q7CgkJcHJldiAqPSBnOwoJCXByZXYgJT0gTU9EOwoJCWFucyAtPSBwcmV2OwoJCWlmKGFucyA8IDApYW5zICs9IE1PRDsKCQlhbnMgJT0gTU9EOwoJCQoJfQoJCgljb3V0IDw8IGFucyA8PCAiXG4iOwp9CgppbnQzMl90IG1haW4oKXsKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwoJY2luLnRpZShudWxscHRyKTsKCQoJaW50IHQgPSAxOwoJLy8gY2luID4+IHQ7CgkKCWZvcihpbnQgaSA9IDI7IGkgPD0gMWU2OyBpKyspewoJCWlmKCFwcmltZVtpXSljb250aW51ZTsKCQlmb3IoaW50IGogPSBpICogaTsgaiA8PSAxZTY7ICBqICs9IGkpcHJpbWVbal0gPSAwOwoJfQoJCglmb3IoaW50IGkgPSAxOyBpIDw9IHQ7IGkrKyl7CgkJc29sdmUoKTsKCX0KCXJldHVybiAwOwp9