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

#include <algorithm>
#include <complex>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <limits>
#include <locale>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <time.h>
#include <type_traits>
#include <vector>

using namespace std;
#define SAY_YES cout << "YES" << endl;
#define SAY_Yes cout << "Yes" << endl;
#define SAY_NO cout << "NO" << endl;
#define SAY_No cout << "No" << endl;
#define IFYES(TRUE_OR_FALSE)                                                   \\
  if (TRUE_OR_FALSE) {                                                         \\
    cout << "YES" << endl;                                                     \\
  } else {                                                                     \\
    cout << "NO" << endl;                                                      \\
  }
#define IFYes(TRUE_OR_FALSE)                                                   \\
  if (TRUE_OR_FALSE) {                                                         \\
    cout << "Yes" << endl;                                                     \\
  } else {                                                                     \\
    cout << "No" << endl;                                                      \\
  }
#define IFyes(TRUE_OR_FALSE)                                                   \\
  if (TRUE_OR_FALSE) {                                                         \\
    cout << "yes" << endl;                                                     \\
  } else {                                                                     \\
    cout << "no" << endl;                                                      \\
  }
#define DEBUG_OUTPUT_ARRAY(XXX, ONE)                                           \\
  for (int i = 0; i < (ONE); i++) {                                            \\
    cout << "DEBUG: i = " << i << " -> " << XXX[i] << endl;                    \\
  }
#define DEBUG_OUTPUT_ARRAY2(XXX, ONE, TWO)                                     \\
  for (int i = 0; i < (ONE); i++) {                                            \\
    cout << "<<< i = " << i << " >>>" << endl;                                 \\
    for (int j = 0; j < (TWO); j++) {                                          \\
      cout << "DEBUG: j = " << j << " -> " << XXX[i][j] << endl;               \\
    }                                                                          \\
  }
#define DEBUG_OUTPUT_ARRAY2_BOX(XXX, ONE, TWO)                                 \\
  for (int i = 0; i < (ONE); i++) {                                            \\
    cout << i << "  ";                                                         \\
    for (int j = 0; j < (TWO); j++) {                                          \\
      cout << XXX[i][j] << " ";                                                \\
    }                                                                          \\
    cout << endl;                                                              \\
  }

typedef pair<long long int, long long int> pll;
typedef pair<long long int, pll> lpll;

const long long int mod = 998244353;
const long long int INF = 1e18;
const long double PI = 3.14159265358979323;
const long long int pl = 1000000;

long long int A[5002], B[200200], N, S, res = 0, P[2002000] = {}, now = 1,
                                        dp[5005][5005] = {};

// 累乗(繰り返し2乗法)　aのb乗(mod)を求める。
class Ruizyou {
public:
  long long int rui(long long int a, long long int b, long long mod) {
    int memo[65] = {};
    long long int A[65] = {};
    long long int tmp = 1;
    for (int i = 0; i < 65; i++) {
      memo[i] = b % 2;
      b /= 2;
    }

    A[0] = a;
    A[0] %= mod;

    for (int i = 1; i < 65; i++) {
      A[i] = A[i - 1] * A[i - 1];
      A[i] %= mod;
    }
    for (int i = 0; i < 65; i++) {
      if (memo[i] == 1) {
        tmp *= A[i];
        tmp %= mod;
      }
    }
    tmp %= mod;
    return tmp;
  }
};
long long int memo;
int main() {
  cout << fixed << setprecision(18);
  cin >> N >> S;
  Ruizyou rui;
  for (long long int i = 1; i <= N; i++) {
    cin >> A[i];
  }
  memo = rui.rui(2, mod - 2, mod);
  for (int i = 1; i <= N; i++) {
    for (int j = 0; j <= S; j++) {
      if (j + A[i] <= S) {
        dp[i][j + A[i]] += dp[i - 1][j] * memo;
        dp[i][j + A[i]] %= mod;
      }
      dp[i][j] += dp[i - 1][j];
      dp[i][j] %= mod;
    }
    if (A[i] <= S) {
      dp[i][A[i]] += rui.rui(2, N - 1, mod);
      dp[i][A[i]] %= mod;
    }
  }
  cout << dp[N][S] << endl;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <complex>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <limits>
#include <locale>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <time.h>
#include <type_traits>
#include <vector>

using namespace std;
#define SAY_YES cout << "YES" << endl;
#define SAY_Yes cout << "Yes" << endl;
#define SAY_NO cout << "NO" << endl;
#define SAY_No cout << "No" << endl;
#define IFYES(TRUE_OR_FALSE)                                                   \\
  if (TRUE_OR_FALSE) {                                                         \\
    cout << "YES" << endl;                                                     \\
  } else {                                                                     \\
    cout << "NO" << endl;                                                      \\
  }
#define IFYes(TRUE_OR_FALSE)                                                   \\
  if (TRUE_OR_FALSE) {                                                         \\
    cout << "Yes" << endl;                                                     \\
  } else {                                                                     \\
    cout << "No" << endl;                                                      \\
  }
#define IFyes(TRUE_OR_FALSE)                                                   \\
  if (TRUE_OR_FALSE) {                                                         \\
    cout << "yes" << endl;                                                     \\
  } else {                                                                     \\
    cout << "no" << endl;                                                      \\
  }
#define DEBUG_OUTPUT_ARRAY(XXX, ONE)                                           \\
  for (int i = 0; i < (ONE); i++) {                                            \\
    cout << "DEBUG: i = " << i << " -> " << XXX[i] << endl;                    \\
  }
#define DEBUG_OUTPUT_ARRAY2(XXX, ONE, TWO)                                     \\
  for (int i = 0; i < (ONE); i++) {                                            \\
    cout << "<<< i = " << i << " >>>" << endl;                                 \\
    for (int j = 0; j < (TWO); j++) {                                          \\
      cout << "DEBUG: j = " << j << " -> " << XXX[i][j] << endl;               \\
    }                                                                          \\
  }
#define DEBUG_OUTPUT_ARRAY2_BOX(XXX, ONE, TWO)                                 \\
  for (int i = 0; i < (ONE); i++) {                                            \\
    cout << i << "  ";                                                         \\
    for (int j = 0; j < (TWO); j++) {                                          \\
      cout << XXX[i][j] << " ";                                                \\
    }                                                                          \\
    cout << endl;                                                              \\
  }

typedef pair<long long int, long long int> pll;
typedef pair<long long int, pll> lpll;

const long long int mod = 998244353;
const long long int INF = 1e18;
const long double PI = 3.14159265358979323;
const long long int pl = 1000000;

long long int A[5002], B[200200], N, S, res = 0, P[2002000] = {}, now = 1,
                                        dp[3005][3005] = {};

// 累乗(繰り返し2乗法)　aのb乗(mod)を求める。
class Ruizyou {
public:
  long long int rui(long long int a, long long int b, long long mod) {
    int memo[65] = {};
    long long int A[65] = {};
    long long int tmp = 1;
    for (int i = 0; i < 65; i++) {
      memo[i] = b % 2;
      b /= 2;
    }

    A[0] = a;
    A[0] %= mod;

    for (int i = 1; i < 65; i++) {
      A[i] = A[i - 1] * A[i - 1];
      A[i] %= mod;
    }
    for (int i = 0; i < 65; i++) {
      if (memo[i] == 1) {
        tmp *= A[i];
        tmp %= mod;
      }
    }
    tmp %= mod;
    return tmp;
  }
};

int main() {
  cout << fixed << setprecision(18);
  cin >> N >> S;
  Ruizyou rui;
  for (long long int i = 1; i <= N; i++) {
    cin >> A[i];
  }
  for (int i = 1; i <= N; i++) {
    for (int j = 0; j <= S; j++) {
      if (j + A[i] <= S) {
        dp[i][j + A[i]] += dp[i - 1][j] * rui.rui(2, mod - 2, mod);
        dp[i][j + A[i]] %= mod;
      }
      dp[i][j] += dp[i - 1][j];
      dp[i][j] %= mod;
    }
    if (A[i] <= S)
      dp[i][A[i]] += rui.rui(2, N - 1, mod);
    dp[i][A[i]] %= mod;
  }
  cout << dp[N][S] << endl;
}