Problem p02990 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, a, b) for (int i = a; i < b; i++)
#define rrep(i, a, b) for (int i = a; i >= b; i--)
//-------------------------------------------
ll mod = 1000000007; // mod1000000007を扱うケース
//-------------------------------------------
//--------------------------------------------
// 逆元の計算　フェルマーの小定理の利用,繰り返し二乗法
ll inv(ll x) {
  ll res = 1;
  ll k = mod - 2;
  ll y = x;
  while (
      k) { //                          2進数表記に直して累乗を計算する（繰り返し二乗法）
    if (k & 1)
      res = (res * y) % mod; //& ビットAnd、左辺と右辺のビットを合成し、互いに 1
                             //のビットを 1 とする。
    //                              11111111 と 10101010
    //                              (16進数で、FFとAA),11111111 & 10101010
    //                              は、10101010
    y = (y * y) % mod;
    k /= 2; // 2進数の桁をずらすことに対応している
            // 2^0の後は2^1,2^2...といった具合
  }
  return res;
}
//-----------------------------------------------
// 階乗の累積和を計算しておく。fの要素の数は問題によって変えよう。
// 逆元もあらかじめ計算してしまうことで高速化できる。
// 逆元を求める関数を呼び出す回数を1回に抑えてより高速化
ll f[2010], rf[2010];
void init() {
  f[0] = 1;
  rep(i, 1, 2010) f[i] = (f[i - 1] * i) % mod;
  rf[2010 - 1] = inv(f[2010 - 1]);
  rrep(i, 2010 - 2, 0) rf[i] = (rf[i + 1] * (i + 1)) % mod;
}
//-------------------------------------------------
// nCrを求める関数
ll C(int n, int k) {
  ll a = f[n];      //=n!
  ll b = rf[n - k]; //=(n-k)!
  ll c = rf[k];     //=k!

  ll bc = (b * c) % mod;

  return (a * bc) % mod; // 割り算ではなく逆元を用いてる（modの処理のため）
}

int main() {
  init();

  int n, k;
  ll ans;
  cin >> n >> k;
  rep(i, 1, k + 1) {
    if (k == n && i == 1)
      ans = 1;
    else {
      if (k == n && i != 1)
        ans = 0;
      else {
        ans = C(k - 1, i - 1) * C(n - k + 1, i) % mod;
      }
    }
    cout << ans << endl;
  }
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define rep(i, a, b) for (int i = a; i < b; i++)
#define rrep(i, a, b) for (int i = a; i >= b; i--)
//-------------------------------------------
ll mod = 1000000007; // mod1000000007を扱うケース
//-------------------------------------------
//--------------------------------------------
// 逆元の計算　フェルマーの小定理の利用,繰り返し二乗法
ll inv(ll x) {
  ll res = 1;
  ll k = mod - 2;
  ll y = x;
  while (
      k) { //                          2進数表記に直して累乗を計算する（繰り返し二乗法）
    if (k & 1)
      res = (res * y) % mod; //& ビットAnd、左辺と右辺のビットを合成し、互いに 1
                             //のビットを 1 とする。
    //                              11111111 と 10101010
    //                              (16進数で、FFとAA),11111111 & 10101010
    //                              は、10101010
    y = (y * y) % mod;
    k /= 2; // 2進数の桁をずらすことに対応している
            // 2^0の後は2^1,2^2...といった具合
  }
  return res;
}
//-----------------------------------------------
// 階乗の累積和を計算しておく。fの要素の数は問題によって変えよう。
// 逆元もあらかじめ計算してしまうことで高速化できる。
// 逆元を求める関数を呼び出す回数を1回に抑えてより高速化
ll f[2010], rf[2010];
void init() {
  f[0] = 1;
  rep(i, 1, 2010) f[i] = (f[i - 1] * i) % mod;
  rf[2010 - 1] = inv(f[2010 - 1]);
  rrep(i, 2010 - 2, 0) rf[i] = (rf[i + 1] * (i + 1)) % mod;
}
//-------------------------------------------------
// nCrを求める関数
ll C(int n, int k) {
  ll a = f[n];      //=n!
  ll b = rf[n - k]; //=(n-k)!
  ll c = rf[k];     //=k!

  ll bc = (b * c) % mod;

  return (a * bc) % mod; // 割り算ではなく逆元を用いてる（modの処理のため）
}

int main() {
  init();

  int n, k;
  ll ans;
  cin >> n >> k;
  rep(i, 1, k + 1) {
    if (k == n && i == 1)
      ans = 1;
    else {
      if (i > n - k + 1)
        ans = 0;
      else {
        ans = C(k - 1, i - 1) * C(n - k + 1, i) % mod;
      }
    }
    cout << ans << endl;
  }
}