Problem p02632 (C++) — buggy submission, verdict: Time Limit Exceeded

bool DBG = false;
// #pragma GCC optimize("Ofast")
//  #pragma GCC
//  target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
// #pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
// #include <boost/multiprecision/cpp_dec_float.hpp>
// #include <boost/multiprecision/cpp_int.hpp>
using namespace std;
using ll = long long;
using ld = long double;
// using i128 = __int128_t;
// using bint = boost::multiprecision::cpp_int;
// using d1024 = boost::multiprecision::number<mp::cpp_dec_float<1024>>;
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define IFOR(i, a, b) for (int i = ((b)-1); i >= (a); --i)
#define RPT(i, a, b) for (int i = (a); i < ((a) + (b)); ++i)
#define IRPT(i, a, b) for (int i = ((a) + (b)-1); i >= (a); --i)
#define ALL(x) x.begin(), x.end()
#define RALL(x) x.rbegin(), x.rend()
#define fs first
#define sd second
#define couts(x) cout << (x) << (" ")
#define coutn(x) cout << (x) << ("\\n")
// #define ncouts(x) numout(x),outst[outst_N++] = ' '
// #define ncoutn(x) numout(x),outst[outst_N++] = '\\n'
// #define scouts(x) strout(x),outst[outst_N++] = ' '
// #define scoutn(x) strout(x),outst[outst_N++] = '\\n'
#define dcouts(x)                                                              \\
  if (DBG)                                                                     \\
  couts(x)
#define dcoutn(x)                                                              \\
  if (DBG)                                                                     \\
  coutn(x)
#define endl "\\n"
#define psb push_back
#define ppb pop_back
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define LBIT(x, a) (((x) >> (a)) & 1LL)
#define IBIT(x, a) (((x) >> (a)) & 1)
#define BCOUNT(x) (__builtin_popcount(x))
#define sorta(x) sort(ALL(x))
#define sortra(x) sort(RALL(x))
template <typename T>
std::istream &operator>>(std::istream &is, std::vector<T> &vec) {
  for (auto &v : vec)
    is >> v;
  return is;
}
template <typename T1, typename T2>
std::istream &operator>>(std::istream &is, std::pair<T1, T2> &p) {
  is >> p.first >> p.second;
  return is;
}
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::vector<T> &vec) {
  os << "[";
  for (auto v : vec)
    os << v << ",";
  os << "]";
  return os;
}
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::deque<T> &vec) {
  os << "deque[";
  for (auto v : vec)
    os << v << ",";
  os << "]";
  return os;
}
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::set<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::unordered_set<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::multiset<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T>
std::ostream &operator<<(std::ostream &os,
                         const std::unordered_multiset<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T1, typename T2>
std::ostream &operator<<(std::ostream &os, const std::pair<T1, T2> &pa) {
  os << "(" << pa.first << "," << pa.second << ")";
  return os;
}
template <typename TK, typename TV>
std::ostream &operator<<(std::ostream &os, const std::map<TK, TV> &mp) {
  os << "{";
  for (auto v : mp)
    os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}
template <typename TK, typename TV>
std::ostream &operator<<(std::ostream &os,
                         const std::unordered_map<TK, TV> &mp) {
  os << "{";
  for (auto v : mp)
    os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}
/*
std::ostream &operator<<(std::ostream &os, const i128 nu){
  i128 co = nu;
  if(co==0){cout << '0';}
  else{
    string ous; if(co<0){cout<<'-'; co*=-1;}
    while(co){
      ous += (co%10)+'0';
      co /= 10;
    }
    reverse(ALL(ous));
    cout<<ous;
  }
  return os;
}
std::istream &operator>>(std::istream &is, i128 &nu){ string cs; cin >> cs;
nu=0;int mn=1; for(auto &x:cs) { if(x!='-'){nu*=10;nu+=(x-'0');} else mn *= -1;}
nu *= mn;  return is; }

*/

template <class T> using V = vector<T>;
template <class T> using V2 = V<V<T>>;
template <class T> using V3 = V<V2<T>>;
template <class T> using V4 = V<V3<T>>;

constexpr ll LINF = 1LL << 60;
constexpr int IINF = 1 << 28;
constexpr ll mod = 1'000'000'007;
// constexpr ll mod = 998244353;

ll modpow(ll a, ll n, ll m = mod) {
  ll res = 1;
  while (n) {
    if (n & 1)
      res = res * a % m;
    a = a * a % m;
    n >>= 1;
  }
  return res;
}

struct STMOD {
  int n;
  V<ll> f, invf;
  STMOD(int N = 3000200) : n(N), f(N), invf(N) {
    f[0] = 1;
    FOR(i, 0, N - 10) f[i + 1] = (i + 1) * f[i] % mod;
    FOR(i, 0, N - 10) invf[i] = modpow(f[i], mod - 2);
  }
  ll comb(ll a, ll b) {
    if (a < 0 || b < 0 || a < b)
      return 0LL;
    ll ret = 1;
    ret *= f[a];
    (ret *= invf[b]) %= mod;
    (ret *= invf[a - b]) %= mod;
    return ret;
  }
};

void solve6() {
  STMOD sm(3000200);
  using PIL = pair<int, ll>;
  ll k;
  string s;
  cin >> k >> s;
  int n = s.size();
  /*
  V<PIL> v(1); v[0].fs = s[0]-'a'; v[0].sd++;
  FOR(i,1,n){
    if(v.back().fs==s[i]-'a') v.back().sd++;
    else v.eb((int)(s[i]-'a'),1LL);
  }
  coutn(v);*/
  /*
  V2<ll> vs(n+k+1, V<ll>(n+k+1) );
  vs[0][0] = 1;
  FOR(i,0,n+1){
    FOR(j,0,n+k){
      (vs[i][j+1] += 25LL*vs[i][j]) %= mod;
      if(i==n) (vs[i][j+1] += vs[i][j]) %= mod;
      if(i+1<=n) (vs[i+1][j+1] += vs[i][j] ) %= mod;
    }
  }

  for(auto &x:vs){
    for(auto &y :x) couts(y);
    coutn("");
  }
  cout << vs[n][n+k] << endl;


  FOR(i,0,n+k+1){
    FOR(j,0,n+k+1){
      vs[i][j] = 0;
    }
  }
  vs[0][0] = 1;
  FOR(i,0,n+k){
    FOR(j,0,n+k){
      (vs[i][j+1] += 25LL*vs[i][j]) %= mod;
      (vs[i+1][j+1] += vs[i][j]) %= mod;
    }
  }
  for(auto &x:vs){
    for(auto &y :x) couts(y);
    coutn("");
  }*/
  ll ans = 0;
  // FOR(i,n,n+k+1) (ans += vs[i][n+k]) %= mod;
  // coutn(ans);

  ans = 0;
  FOR(i, n, n + k + 1) {
    ll tmp = sm.comb(n + k, i);
    (tmp *= modpow(25, n + k - i)) %= mod;
    (ans += tmp) %= mod;
  }
  coutn(ans);
}

void solve() { solve6(); }

int main(void) {
  // std::cout << std::fixed << std::setprecision(20);
  cin.tie(0);
  // ios::sync_with_stdio(false);
  solve();
  // printf("%s", outst);
  return 0;
}


Error: TLE

Fixed submission:

bool DBG = false;
// #pragma GCC optimize("Ofast")
//  #pragma GCC
//  target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
// #pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
// #include <boost/multiprecision/cpp_dec_float.hpp>
// #include <boost/multiprecision/cpp_int.hpp>
using namespace std;
using ll = long long;
using ld = long double;
// using i128 = __int128_t;
// using bint = boost::multiprecision::cpp_int;
// using d1024 = boost::multiprecision::number<mp::cpp_dec_float<1024>>;
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define IFOR(i, a, b) for (int i = ((b)-1); i >= (a); --i)
#define RPT(i, a, b) for (int i = (a); i < ((a) + (b)); ++i)
#define IRPT(i, a, b) for (int i = ((a) + (b)-1); i >= (a); --i)
#define ALL(x) x.begin(), x.end()
#define RALL(x) x.rbegin(), x.rend()
#define fs first
#define sd second
#define couts(x) cout << (x) << (" ")
#define coutn(x) cout << (x) << ("\\n")
// #define ncouts(x) numout(x),outst[outst_N++] = ' '
// #define ncoutn(x) numout(x),outst[outst_N++] = '\\n'
// #define scouts(x) strout(x),outst[outst_N++] = ' '
// #define scoutn(x) strout(x),outst[outst_N++] = '\\n'
#define dcouts(x)                                                              \\
  if (DBG)                                                                     \\
  couts(x)
#define dcoutn(x)                                                              \\
  if (DBG)                                                                     \\
  coutn(x)
#define endl "\\n"
#define psb push_back
#define ppb pop_back
#define eb emplace_back
#define lb lower_bound
#define ub upper_bound
#define LBIT(x, a) (((x) >> (a)) & 1LL)
#define IBIT(x, a) (((x) >> (a)) & 1)
#define BCOUNT(x) (__builtin_popcount(x))
#define sorta(x) sort(ALL(x))
#define sortra(x) sort(RALL(x))
template <typename T>
std::istream &operator>>(std::istream &is, std::vector<T> &vec) {
  for (auto &v : vec)
    is >> v;
  return is;
}
template <typename T1, typename T2>
std::istream &operator>>(std::istream &is, std::pair<T1, T2> &p) {
  is >> p.first >> p.second;
  return is;
}
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::vector<T> &vec) {
  os << "[";
  for (auto v : vec)
    os << v << ",";
  os << "]";
  return os;
}
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::deque<T> &vec) {
  os << "deque[";
  for (auto v : vec)
    os << v << ",";
  os << "]";
  return os;
}
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::set<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::unordered_set<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T>
std::ostream &operator<<(std::ostream &os, const std::multiset<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T>
std::ostream &operator<<(std::ostream &os,
                         const std::unordered_multiset<T> &vec) {
  os << "{";
  for (auto v : vec)
    os << v << ",";
  os << "}";
  return os;
}
template <typename T1, typename T2>
std::ostream &operator<<(std::ostream &os, const std::pair<T1, T2> &pa) {
  os << "(" << pa.first << "," << pa.second << ")";
  return os;
}
template <typename TK, typename TV>
std::ostream &operator<<(std::ostream &os, const std::map<TK, TV> &mp) {
  os << "{";
  for (auto v : mp)
    os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}
template <typename TK, typename TV>
std::ostream &operator<<(std::ostream &os,
                         const std::unordered_map<TK, TV> &mp) {
  os << "{";
  for (auto v : mp)
    os << v.first << "=>" << v.second << ",";
  os << "}";
  return os;
}
/*
std::ostream &operator<<(std::ostream &os, const i128 nu){
  i128 co = nu;
  if(co==0){cout << '0';}
  else{
    string ous; if(co<0){cout<<'-'; co*=-1;}
    while(co){
      ous += (co%10)+'0';
      co /= 10;
    }
    reverse(ALL(ous));
    cout<<ous;
  }
  return os;
}
std::istream &operator>>(std::istream &is, i128 &nu){ string cs; cin >> cs;
nu=0;int mn=1; for(auto &x:cs) { if(x!='-'){nu*=10;nu+=(x-'0');} else mn *= -1;}
nu *= mn;  return is; }

*/

template <class T> using V = vector<T>;
template <class T> using V2 = V<V<T>>;
template <class T> using V3 = V<V2<T>>;
template <class T> using V4 = V<V3<T>>;

constexpr ll LINF = 1LL << 60;
constexpr int IINF = 1 << 28;
constexpr ll mod = 1'000'000'007;
// constexpr ll mod = 998244353;

ll modpow(ll a, ll n, ll m = mod) {
  ll res = 1;
  while (n) {
    if (n & 1)
      res = res * a % m;
    a = a * a % m;
    n >>= 1;
  }
  return res;
}

struct STMOD {
  int n;
  V<ll> f, invf;
  STMOD(int N = 3000200) : n(N), f(N), invf(N) {
    f[0] = 1;
    FOR(i, 0, N - 10) f[i + 1] = (i + 1) * f[i] % mod;
    FOR(i, 0, N - 10) invf[i] = modpow(f[i], mod - 2);
  }
  ll comb(ll a, ll b) {
    if (a < 0 || b < 0 || a < b)
      return 0LL;
    ll ret = 1;
    ret *= f[a];
    (ret *= invf[b]) %= mod;
    (ret *= invf[a - b]) %= mod;
    return ret;
  }
};

void solve6() {
  STMOD sm(3000200);
  using PIL = pair<int, ll>;
  ll k;
  string s;
  cin >> k >> s;
  int n = s.size();
  /*
  V<PIL> v(1); v[0].fs = s[0]-'a'; v[0].sd++;
  FOR(i,1,n){
    if(v.back().fs==s[i]-'a') v.back().sd++;
    else v.eb((int)(s[i]-'a'),1LL);
  }
  coutn(v);*/

  V2<ll> vs(n + 1, V<ll>(n + k + 1));
  vs[0][0] = 1;
  FOR(i, 0, n + 1) {
    FOR(j, 0, n + k) {
      (vs[i][j + 1] += 25LL * vs[i][j]) %= mod;
      if (i == n)
        (vs[i][j + 1] += vs[i][j]) %= mod;
      if (i + 1 <= n)
        (vs[i + 1][j + 1] += vs[i][j]) %= mod;
    }
  }
  /*
  for(auto &x:vs){
    for(auto &y :x) couts(y);
    coutn("");
  }*/

  cout << vs[n][n + k];
}

void solve() { solve6(); }

int main(void) {
  // std::cout << std::fixed << std::setprecision(20);
  cin.tie(0);
  // ios::sync_with_stdio(false);
  solve();
  // printf("%s", outst);
  return 0;
}