func_code_string: #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;   }   