#include <bits/stdc++.h>
namespace FastIO {
bool IOerror = 0;
inline char nc() {
  static char buf[100000], *p1 = buf + 100000, *pend = buf + 100000;
  if (p1 == pend) {
    p1 = buf;
    pend = buf + fread(buf, 1, 100000, stdin);
    if (pend == p1) {
      IOerror = 1;
      return -1;
    }
  }
  return *p1++;
}
inline bool blank(char ch) {
  return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';
}
template <class T>
inline bool read(T& x) {
  bool sign = 0;
  char ch = nc();
  x = 0;
  for (; blank(ch); ch = nc())
    ;
  if (IOerror) return false;
  if (ch == '-') sign = 1, ch = nc();
  for (; ch >= '0' && ch <= '9'; ch = nc()) x = x * 10 + ch - '0';
  if (sign) x = -x;
  return true;
}
template <class T, class... U>
bool read(T& h, U&... t) {
  return read(h) && read(t...);
}
};  // namespace FastIO
using namespace std;
using namespace FastIO;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int INF = 0x3f3f3f3f;
const int mod = 998244353;
const int N = 2e5 + 10;
long long fac[N], invfac[N];
long long qpow(long long x, int n) {
  long long res = 1;
  while (n) {
    if (n & 1) res = res * x % mod;
    x = x * x % mod;
    n /= 2;
  }
  return res;
}
void init() {
  fac[0] = invfac[0] = 1;
  for (int i = 1; i < N; i++) {
    fac[i] = fac[i - 1] * i % mod;
    invfac[i] = qpow(fac[i], mod - 2);
  }
}
long long comb(int n, int m) {
  if (m > n) return 0;
  return fac[n] * invfac[m] % mod * invfac[n - m] % mod;
}
int main() {
  long long n, k;
  read(n, k);
  long long ans = 0;
  if (k < n) {
    init();
    k = n - k;
    for (int i = 0; i <= k; i++)
      ans = (ans + (i % 2 ? -1 : 1) * comb(k, i) * qpow(k - i, n) + mod) % mod;
    if (n != k) ans = 2 * ans * comb(n, k) % mod;
  }
  cout << ans << endl;
  return 0;
}
