Problem p03270 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define ll long long
#define inf 0x3f3f3f3f
#define mod 998244353
#define maxn 2010
inline ll read() {
  ll x = 0;
  char c = getchar(), f = 1;
  for (; c < '0' || '9' < c; c = getchar())
    if (c == '-')
      f = -1;
  for (; '0' <= c && c <= '9'; c = getchar())
    x = x * 10 + c - '0';
  return x * f;
}
inline void write(ll x) {
  static char buf[20];
  int len = 0;
  if (x < 0)
    putchar('-'), x = -x;
  for (; x; x /= 10)
    buf[len++] = x % 10 + '0';
  if (!len)
    putchar('0');
  else
    while (len)
      putchar(buf[--len]);
}
inline void writesp(ll x) {
  write(x);
  putchar(' ');
}
inline void writeln(ll x) {
  write(x);
  putchar('\n');
}
ll fac[maxn], inv[maxn];
int n, k;
ll power(ll a, ll b) {
  ll ans = 1;
  for (; b; b >>= 1, a = a * a % mod)
    if (b & 1)
      ans = ans * a % mod;
  return ans;
}
ll C(int n, int m) {
  return (n < 0 || m < 0 || m > n) ? 0
                                   : fac[n] * inv[m] % mod * inv[n - m] % mod;
}
ll calc(int n, int m, int k) {
  ll tot = 0;
  for (int i = 0; i <= k; i++)
    tot += C(k, i) * power(2, i) % mod * C(n + m - 1, n - i) % mod;
  // printf("%d %d %d : %lld\n",n,m,k,tot);
  return tot % mod;
}
int main() {
  k = read();
  n = read();
  fac[0] = inv[0] = 1;
  for (int i = 1; i <= n + k; i++) {
    fac[i] = fac[i - 1] * i % mod;
    inv[i] = power(fac[i], mod - 2);
  }
  for (int i = 2; i <= 2 * k; i++) {
    int cnt = std::min((i - 1) / 2, (2 * k + 1 - i) / 2);
    if (i & 1)
      writeln(calc(n, k - 2 * cnt, cnt));
    else
      writeln(
          (calc(n, k - 1 - 2 * cnt, cnt) + calc(n - 1, k - 1 - 2 * cnt, cnt)) %
          mod);
  }
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define ll long long
#define inf 0x3f3f3f3f
#define mod 998244353
#define maxn 2010
inline ll read() {
  ll x = 0;
  char c = getchar(), f = 1;
  for (; c < '0' || '9' < c; c = getchar())
    if (c == '-')
      f = -1;
  for (; '0' <= c && c <= '9'; c = getchar())
    x = x * 10 + c - '0';
  return x * f;
}
inline void write(ll x) {
  static char buf[20];
  int len = 0;
  if (x < 0)
    putchar('-'), x = -x;
  for (; x; x /= 10)
    buf[len++] = x % 10 + '0';
  if (!len)
    putchar('0');
  else
    while (len)
      putchar(buf[--len]);
}
inline void writesp(ll x) {
  write(x);
  putchar(' ');
}
inline void writeln(ll x) {
  write(x);
  putchar('\n');
}
ll fac[2 * maxn], inv[2 * maxn];
int n, k;
ll power(ll a, ll b) {
  ll ans = 1;
  for (; b; b >>= 1, a = a * a % mod)
    if (b & 1)
      ans = ans * a % mod;
  return ans;
}
ll C(int n, int m) {
  return (n < 0 || m < 0 || m > n) ? 0
                                   : fac[n] * inv[m] % mod * inv[n - m] % mod;
}
ll calc(int n, int m, int k) {
  ll tot = 0;
  for (int i = 0; i <= k; i++)
    tot += C(k, i) * power(2, i) % mod * C(n + m - 1, n - i) % mod;
  // printf("%d %d %d : %lld\n",n,m,k,tot);
  return tot % mod;
}
int main() {
  k = read();
  n = read();
  fac[0] = inv[0] = 1;
  for (int i = 1; i <= n + k; i++) {
    fac[i] = fac[i - 1] * i % mod;
    inv[i] = power(fac[i], mod - 2);
  }
  for (int i = 2; i <= 2 * k; i++) {
    int cnt = std::min((i - 1) / 2, (2 * k + 1 - i) / 2);
    if (i & 1)
      writeln(calc(n, k - 2 * cnt, cnt));
    else
      writeln(
          (calc(n, k - 1 - 2 * cnt, cnt) + calc(n - 1, k - 1 - 2 * cnt, cnt)) %
          mod);
  }
  return 0;
}