#include<bits/stdc++.h> 
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
#define f(x, m) for(auto x : m)
#define cpu() ios::sync_with_stdio(false); cin.tie(nullptr)
#define pb push_back
#define pii pair<int,int>
#define pll pair<ll, ll>
#define vi vector<int>
#define vl vector<ll>
#define vii vector<pair<int ,int>>
#define vll vector<pair<ll ,ll>>
#define all(v) v.begin(),v.end()
#define sor(a) sort( a.begin(), a.end() )
#define ros(a) sort( a.rbegin(), a.rend())
#define prec(n) fixed << setprecision(n)
#define ff first
#define ss second
#define print(x) for(auto it : x) cout << it << " ";
#define debug(x) cerr << #x << " is " << x << endl;

typedef long long ll;
using namespace std;
// using namespace __gnu_pbds;
#define dbg(args...){ string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }
void err(istream_iterator<string> ) {cout << "NEXT\n"; }
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
cerr << *it << " = " << a << ", ";
err(++it, args...);
}
template<typename... T>
void rd(T& ... args){
   (( cin >> args), ...);
}
template<typename... T>
void ps(T ... args){
   ((cout << args << ' '), ...);
   cout << '\n';
}
//  mp.max_load_factor(0.25); 
// using ordered_set = tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update>;
const int MOD = 998244353, MAX = 2e5 + 5;
const char nl = '\n';      
const int INF = 1e9 + 5; 
int n, m;
int cn[MAX][20];
ll fac[MAX];
ll pot(ll x, ll y){
   if(y == 0) return 1; 
   if(y & 1) return (pot(x, y - 1) * x) % MOD;
   ll k = pot(x, y / 2);
   return (k * k) % MOD;
}
ll inv(ll x){
   return pot(x, MOD - 2);
}
ll comb(int x, int y){
   if(x < y) return 0;
   return (((fac[x] * inv(fac[y])) % MOD) * inv(fac[x - y])) % MOD;
}
void solve(){
   cin >> n >> m;
   cn[1][0] = 1;
   for(int i = 2; i <= m; i++){
      cn[i][0] = 1;
      for(int j = 1; j * j <= i; j++){
         if(i % j) continue;
         for(int k = 1; k < 20; k++){
            cn[i][k] += cn[j][k - 1];
         }
         if(j * j != i && j != 1){
            for(int k = 1; k < 20; k++){
               cn[i][k] += cn[i / j][k - 1];
            }
         }
      }
   }
   ll ans = 0;
   vector<int> CN(20);
   for(int i = 1; i <= m; i++){
      for(int j = 0; j < 20; j++){
         CN[j] += cn[i][j];
      }
   }
   for(int j = 0; j < 20; j++){
      ans = (ans + comb(n - 1, j) * CN[j]) % MOD;
   }
   cout << ans << "\n";
}
int main(){
   cpu();
   fac[0] = 1;
   for(int i = 1; i < MAX; i++){
      fac[i] = (fac[i - 1] * i) % MOD;
   }
   solve();

   return 0;
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define rep(i, n) for (int i = 0; i < n; i++)
#define rep1(i, n) for (int i = 1; i < n + 1; i++)
#define all(A) A.begin(), A.end()
typedef long long ll;

int main()
{
    ll b, c;
    cin >> b >> c;
    ll Rstart, Rend, Lstart, Lend;
    if (c == 1)
    {
        if (b == 0)
        {
            cout << 1 << endl;
        }
        else
        {
            cout << 2 << endl;
        }
        return 0;
    }
    if (c % 2 == 0)
    {
        Rstart = b - c / 2;
        Rend = b + c / 2 - 1;
        Lstart = -b - (c - 1) / 2;
        Lend = -b + (c - 1) / 2;
    }
    else
    {
        Lstart = -b - c / 2;
        Lend = -b + c / 2;
        Rstart = b - (c - 1) / 2;
        Rend = b + (c - 1) / 2 - 1;
    }
    ll rangeR = Rend - Rstart + 1;
    ll rangeL = Lend - Lstart + 1;
    ll RandL = max((ll)0, min(Rend, Lend) - max(Rstart, Lstart) + 1);
    // cout << Lstart << "~~" << Lend << "," << Rstart << "~~" << Rend << endl;
    // cout << rangeL << "," << RandL << "," << rangeR << endl;
    cout << rangeR + rangeL - RandL << endl;
}