Problem p02632 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

using namespace std;

#define INF 1000000007
#define LINF (1LL << 61)
#define PI 3.14159265358979

typedef long long i64;
typedef pair<i64, i64> P;

inline i64 mod(i64 a, i64 m) { return (a % m + m) % m; }

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

int k;
string s;
i64 mod_pow(i64 x, i64 y, i64 mod) {
  i64 res = 1;
  while (y > 0) {
    if (y & 1)
      res = res * x % mod;
    x = x * x % mod;
    y >>= 1;
  }
  return res;
}
const int MAX = 1010101, MOD = INF;
long long fac[MAX], finv[MAX], inv[MAX];
// テーブルを作る前処理
void COMinit() {
  fac[0] = fac[1] = 1;
  finv[0] = finv[1] = 1;
  inv[1] = 1;
  inv[0] = 1;
  for (int i = 2; i < MAX; i++) {
    fac[i] = fac[i - 1] * i % MOD;
    inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;
    finv[i] = finv[i - 1] * inv[i] % MOD;
  }
}
// 二項係数計算
long long C(i64 n, i64 k) {
  if (n < k)
    return 0;
  if (n < 0 || k < 0)
    return 0;
  return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
  /*i64 res = 1;
  for(int i = 1; i <= k; i++){
          res *= n-i+1;
          res %= MOD;
          res *= inv[i];
          res %= MOD;
  }
  return res;
  */
}
void solve() {
  cin >> k >> s;
  int n = s.size();

  COMinit();

  // 文字列sを部分列に含む k+|s|文字の文字列の数は?
  i64 ans = 0;
  for (int i = n; i <= n + k; i++) {
    ans += mod_pow(26, n + k - i, INF) * mod_pow(25, i - n, INF) % INF *
           C(i - 1, n - 1) % INF;
    ans %= INF;
  }
  cout << ans << endl;
}

int main() {
  std::cin.tie(0);
  std::ios::sync_with_stdio(false);
  int t = 1;
  // cin >> t;
  while (t--) {
    solve();
  }

  return 0;
}

Fixed submission:
#include <bits/stdc++.h>

using namespace std;

#define INF 1000000007
#define LINF (1LL << 61)
#define PI 3.14159265358979

typedef long long i64;
typedef pair<i64, i64> P;

inline i64 mod(i64 a, i64 m) { return (a % m + m) % m; }

template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}

int k;
string s;
i64 mod_pow(i64 x, i64 y, i64 mod) {
  i64 res = 1;
  while (y > 0) {
    if (y & 1)
      res = res * x % mod;
    x = x * x % mod;
    y >>= 1;
  }
  return res;
}
const int MAX = 2010101, MOD = INF;
long long fac[MAX], finv[MAX], inv[MAX];
// テーブルを作る前処理
void COMinit() {
  fac[0] = fac[1] = 1;
  finv[0] = finv[1] = 1;
  inv[1] = 1;
  inv[0] = 1;
  for (int i = 2; i < MAX; i++) {
    fac[i] = fac[i - 1] * i % MOD;
    inv[i] = MOD - inv[MOD % i] * (MOD / i) % MOD;
    finv[i] = finv[i - 1] * inv[i] % MOD;
  }
}
// 二項係数計算
long long C(i64 n, i64 k) {
  if (n < k)
    return 0;
  if (n < 0 || k < 0)
    return 0;
  return fac[n] * (finv[k] * finv[n - k] % MOD) % MOD;
  /*i64 res = 1;
  for(int i = 1; i <= k; i++){
          res *= n-i+1;
          res %= MOD;
          res *= inv[i];
          res %= MOD;
  }
  return res;
  */
}
void solve() {
  cin >> k >> s;
  int n = s.size();

  COMinit();

  // 文字列sを部分列に含む k+|s|文字の文字列の数は?
  i64 ans = 0;
  for (int i = n; i <= n + k; i++) {
    ans += mod_pow(26, n + k - i, INF) * mod_pow(25, i - n, INF) % INF *
           C(i - 1, n - 1) % INF;
    ans %= INF;
  }
  cout << ans << endl;
}

int main() {
  std::cin.tie(0);
  std::ios::sync_with_stdio(false);
  int t = 1;
  // cin >> t;
  while (t--) {
    solve();
  }

  return 0;
}