template <typename T> inline T read(){ T x = 0, f = 0; char c = 0; while (!isdigit(c)) f |= c == '-', c = getchar(); while (isdigit(c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar(); return f ? -x : x; }
#define int long long
#define N 1000010 #define P 998244353
int n, k, a[N], b[N], vis[N], res = 1, t;
vector<int> pr;
voidget_prime(){ for (int i = 2; i < N; i ++) { if (!vis[i]) pr.push_back(i); for (int j = 0; j < pr.size() && i * pr[j] < N; j ++) { vis[i * pr[j]] = 1; if (i % pr[j] == 0) break; } } }
signedmain(){ get_prime();
n = read<int>(), k = read<int>(), t = n - k;
for (int i = 1; i <= k; i ++) { a[i] = i, b[i] = t + i; }
for (auto p : pr) { int cnt = 0; for (int i = p; i <= k; i += p) { while (a[i] % p == 0) a[i] /= p, cnt --; } for (int i = (t + p) / p * p; i <= n; i += p) { while (b[i - t] % p == 0) b[i - t] /= p, cnt ++; } res = res * (cnt + 1) % P; }
for (int i = t + 1; i <= n; i ++) { if (b[i - t] != 1) res = res * 2 % P; }