Problem p02632 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pcc pair<char, char>
#define vi vector<int>
#define vl vector<ll>
#define sd(x) scanf("%d", &x)
#define slld(x) scanf("%lld", &x)
#define pd(x) printf("%d", x)
#define plld(x) printf("%lld", x)
#define pds(x) printf("%d ", x)
#define pllds(x) printf("%lld ", x)
#define pdn(x) printf("%d\n", x)
#define plldn(x) printf("%lld\n", x)
#define INF 2e9
#define INFLL 4e18
using namespace std;
ll powmod(ll base, ll exponent, ll mod) { // with mod < 1e9
  ll ans = 1;
  while (exponent) {
    if (exponent & 1)
      ans = (ans * base) % mod;
    base = (base * base) % mod;
    exponent /= 2;
  }
  return ans;
}
ll gcd(ll a, ll b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
const int upperlimit = 1e6 + 100;
const int mod = 1e9 + 7;
ll fact[upperlimit];
ll invfact[upperlimit];
ll ncr(int n, int r) {
  ll ans = fact[n];
  ans *= invfact[r];
  ans %= mod;
  ans *= invfact[n - r];
  ans %= mod;
  return ans;
}
int main() {
  //	freopen(".in","r",stdin);freopen(".out","w",stdout);
  fact[0] = 1;
  invfact[0] = 1;
  for (int i = 1; i < upperlimit; i++) {
    fact[i] = fact[i - 1];
    fact[i] *= i;
    fact[i] %= mod;
    invfact[i] = powmod(fact[i], mod - 2, mod);
  }
  int n;
  string s;
  cin >> n >> s;
  int k = s.size();
  ll ans = 0;
  for (int i = k; i <= n + k; i++) {
    ll calc = ncr(i - 1, k - 1);
    calc *= powmod(25, i - k, mod);
    calc %= mod;
    calc *= powmod(26, n + k - i, mod);
    calc %= mod;
    ans += calc;
    ans %= mod;
  }
  plld(ans);
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pcc pair<char, char>
#define vi vector<int>
#define vl vector<ll>
#define sd(x) scanf("%d", &x)
#define slld(x) scanf("%lld", &x)
#define pd(x) printf("%d", x)
#define plld(x) printf("%lld", x)
#define pds(x) printf("%d ", x)
#define pllds(x) printf("%lld ", x)
#define pdn(x) printf("%d\n", x)
#define plldn(x) printf("%lld\n", x)
#define INF 2e9
#define INFLL 4e18
using namespace std;
ll powmod(ll base, ll exponent, ll mod) { // with mod < 1e9
  ll ans = 1;
  while (exponent) {
    if (exponent & 1)
      ans = (ans * base) % mod;
    base = (base * base) % mod;
    exponent /= 2;
  }
  return ans;
}
ll gcd(ll a, ll b) {
  if (b == 0)
    return a;
  else
    return gcd(b, a % b);
}
const int upperlimit = 2e6 + 100;
const int mod = 1e9 + 7;
ll fact[upperlimit];
ll invfact[upperlimit];
ll ncr(int n, int r) {
  ll ans = fact[n];
  ans *= invfact[r];
  ans %= mod;
  ans *= invfact[n - r];
  ans %= mod;
  return ans;
}
int main() {
  //	freopen(".in","r",stdin);freopen(".out","w",stdout);
  fact[0] = 1;
  invfact[0] = 1;
  for (int i = 1; i < upperlimit; i++) {
    fact[i] = fact[i - 1];
    fact[i] *= i;
    fact[i] %= mod;
    invfact[i] = powmod(fact[i], mod - 2, mod);
  }
  int n;
  string s;
  cin >> n >> s;
  int k = s.size();
  ll ans = 0;
  for (int i = k; i <= n + k; i++) {
    ll calc = ncr(i - 1, k - 1);
    calc *= powmod(25, i - k, mod);
    calc %= mod;
    calc *= powmod(26, n + k - i, mod);
    calc %= mod;
    ans += calc;
    ans %= mod;
  }
  plld(ans);
  return 0;
}