Problem p03375 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;

#define LL long long
#define LB long double
#define ull unsigned long long
#define x first
#define y second
#define pb push_back
#define pf push_front
#define mp make_pair
#define Pair pair<int, int>
#define pLL pair<LL, LL>
#define pii pair<double, double>
#define LOWBIT(x) x & (-x)
#define LOCAL true

const int INF = 2e9;
const LL LINF = 2e16;
const int magic = 348;
const int MOD = 1e9 + 7;
const double eps = 1e-10;
const double pi = acos(-1);

struct fastio {
  static const int S = 1e7;
  char rbuf[S + 48], wbuf[S + 48];
  int rpos, wpos, len;
  fastio() { rpos = len = wpos = 0; }
  inline char Getchar() {
    if (rpos == len)
      rpos = 0, len = fread(rbuf, 1, S, stdin);
    if (!len)
      return EOF;
    return rbuf[rpos++];
  }
  template <class T> inline void Get(T &x) {
    char ch;
    bool f;
    T res;
    while (!isdigit(ch = Getchar()) && ch != '-') {
    }
    if (ch == '-')
      f = false, res = 0;
    else
      f = true, res = ch - '0';
    while (isdigit(ch = Getchar()))
      res = res * 10 + ch - '0';
    x = (f ? res : -res);
  }
  inline void getstring(char *s) {
    char ch;
    while ((ch = Getchar()) <= 32) {
    }
    for (; ch > 32; ch = Getchar())
      *s++ = ch;
    *s = '\0';
  }
  inline void flush() {
    fwrite(wbuf, 1, wpos, stdout);
    fflush(stdout);
    wpos = 0;
  }
  inline void Writechar(char ch) {
    if (wpos == S)
      flush();
    wbuf[wpos++] = ch;
  }
  template <class T> inline void Print(T x, char ch) {
    char s[20];
    int pt = 0;
    if (x == 0)
      s[++pt] = '0';
    else {
      if (x < 0)
        Writechar('-'), x = -x;
      while (x)
        s[++pt] = '0' + x % 10, x /= 10;
    }
    while (pt)
      Writechar(s[pt--]);
    Writechar(ch);
  }
  inline void printstring(char *s) {
    int pt = 1;
    while (s[pt] != '\0')
      Writechar(s[pt++]);
  }
} io;

template <typename T> inline void check_max(T &x, T cmp) { x = max(x, cmp); }
template <typename T> inline void check_min(T &x, T cmp) { x = min(x, cmp); }
template <typename T> inline T myabs(T x) { return x >= 0 ? x : -x; }
template <typename T> inline T gcd(T x, T y) {
  return y == 0 ? x : gcd(y, x % y);
}
inline int add(int x) {
  if (x >= MOD)
    x -= MOD;
  return x;
}
inline int add(int x, int MO) {
  if (x >= MO)
    x -= MO;
  return x;
}
inline int sub(int x) {
  if (x < 0)
    x += MOD;
  return x;
}
inline int sub(int x, int MO) {
  if (x < 0)
    x += MO;
  return x;
}
inline void Add(int &x, int y) { x = add(x + y); }
inline void Add(int &x, int y, int MO) { x = add(x + y, MO); }
inline void Sub(int &x, int y) { x = sub(x - y); }
inline void Sub(int &x, int y, int MO) { x = sub(x - y, MO); }
inline int quick_pow(int x, int y) {
  int res = 1;
  while (y) {
    if (y & 1)
      res = 1ll * res * x % MOD;
    x = 1ll * x * x % MOD;
    y >>= 1;
  }
  return res;
}
inline int quick_pow(int x, int y, int MO) {
  int res = 1;
  while (y) {
    if (y & 1)
      res = 1ll * res * x % MO;
    x = 1ll * x * x % MO;
    y >>= 1;
  }
  return res;
}

const int MAXN = 3000;

int n, M;

int s[MAXN + 48][MAXN + 48];
inline void init_stirling() {
  s[0][0] = 1;
  for (register int i = 1; i <= n; i++)
    for (register int j = 1; j <= i; j++)
      s[i][j] = add(s[i - 1][j - 1] + 1ll * j * s[i - 1][j] % M, M);
}

int c[MAXN + 48][MAXN + 48];
inline void init_c() {
  c[0][0] = 1;
  for (register int i = 1; i <= n; i++) {
    c[i][0] = c[i][i] = 1;
    for (register int j = 1; j <= i - 1; j++)
      c[i][j] = add(c[i - 1][j - 1] + c[i - 1][j], M);
  }
}

int main() {
#ifdef LOCAL
  double TIME = clock();
  freopen("a.in", "r", stdin);
  freopen("a.out", "w", stdout);
  cerr << "Running..." << endl;
#endif
  io.Get(n);
  io.Get(M);
  init_stirling();
  init_c();
  int ans = 0;
  for (register int i = 0; i <= n; i++) {
    int pw1 = quick_pow(2, quick_pow(2, n - i, M - 1), M);
    int pw2 = quick_pow(2, n - i, M), pw = 1;
    for (register int j = 0; j <= i; j++) {
      int res = 1ll * add(1ll * (j + 1) * s[i][j + 1] % M + s[i][j], M) * pw %
                M * pw1 % M * c[n][i] % M;
      if (i & 1)
        Sub(ans, res, M);
      else
        Add(ans, res, M);
      pw = 1ll * pw * pw2 % M;
    }
  }
  io.Print(ans, '\n');
  io.flush();
#ifdef LOCAL
  cerr << "Exec Time: " << (clock() - TIME) / CLOCKS_PER_SEC << endl;
#endif
  return 0;
}

Fixed submission:
#include <bits/stdc++.h>
using namespace std;

#define LL long long
#define LB long double
#define ull unsigned long long
#define x first
#define y second
#define pb push_back
#define pf push_front
#define mp make_pair
#define Pair pair<int, int>
#define pLL pair<LL, LL>
#define pii pair<double, double>
#define LOWBIT(x) x & (-x)
// #define LOCAL true

const int INF = 2e9;
const LL LINF = 2e16;
const int magic = 348;
const int MOD = 1e9 + 7;
const double eps = 1e-10;
const double pi = acos(-1);

struct fastio {
  static const int S = 1e7;
  char rbuf[S + 48], wbuf[S + 48];
  int rpos, wpos, len;
  fastio() { rpos = len = wpos = 0; }
  inline char Getchar() {
    if (rpos == len)
      rpos = 0, len = fread(rbuf, 1, S, stdin);
    if (!len)
      return EOF;
    return rbuf[rpos++];
  }
  template <class T> inline void Get(T &x) {
    char ch;
    bool f;
    T res;
    while (!isdigit(ch = Getchar()) && ch != '-') {
    }
    if (ch == '-')
      f = false, res = 0;
    else
      f = true, res = ch - '0';
    while (isdigit(ch = Getchar()))
      res = res * 10 + ch - '0';
    x = (f ? res : -res);
  }
  inline void getstring(char *s) {
    char ch;
    while ((ch = Getchar()) <= 32) {
    }
    for (; ch > 32; ch = Getchar())
      *s++ = ch;
    *s = '\0';
  }
  inline void flush() {
    fwrite(wbuf, 1, wpos, stdout);
    fflush(stdout);
    wpos = 0;
  }
  inline void Writechar(char ch) {
    if (wpos == S)
      flush();
    wbuf[wpos++] = ch;
  }
  template <class T> inline void Print(T x, char ch) {
    char s[20];
    int pt = 0;
    if (x == 0)
      s[++pt] = '0';
    else {
      if (x < 0)
        Writechar('-'), x = -x;
      while (x)
        s[++pt] = '0' + x % 10, x /= 10;
    }
    while (pt)
      Writechar(s[pt--]);
    Writechar(ch);
  }
  inline void printstring(char *s) {
    int pt = 1;
    while (s[pt] != '\0')
      Writechar(s[pt++]);
  }
} io;

template <typename T> inline void check_max(T &x, T cmp) { x = max(x, cmp); }
template <typename T> inline void check_min(T &x, T cmp) { x = min(x, cmp); }
template <typename T> inline T myabs(T x) { return x >= 0 ? x : -x; }
template <typename T> inline T gcd(T x, T y) {
  return y == 0 ? x : gcd(y, x % y);
}
inline int add(int x) {
  if (x >= MOD)
    x -= MOD;
  return x;
}
inline int add(int x, int MO) {
  if (x >= MO)
    x -= MO;
  return x;
}
inline int sub(int x) {
  if (x < 0)
    x += MOD;
  return x;
}
inline int sub(int x, int MO) {
  if (x < 0)
    x += MO;
  return x;
}
inline void Add(int &x, int y) { x = add(x + y); }
inline void Add(int &x, int y, int MO) { x = add(x + y, MO); }
inline void Sub(int &x, int y) { x = sub(x - y); }
inline void Sub(int &x, int y, int MO) { x = sub(x - y, MO); }
inline int quick_pow(int x, int y) {
  int res = 1;
  while (y) {
    if (y & 1)
      res = 1ll * res * x % MOD;
    x = 1ll * x * x % MOD;
    y >>= 1;
  }
  return res;
}
inline int quick_pow(int x, int y, int MO) {
  int res = 1;
  while (y) {
    if (y & 1)
      res = 1ll * res * x % MO;
    x = 1ll * x * x % MO;
    y >>= 1;
  }
  return res;
}

const int MAXN = 3000;

int n, M;

int s[MAXN + 48][MAXN + 48];
inline void init_stirling() {
  s[0][0] = 1;
  for (register int i = 1; i <= n; i++)
    for (register int j = 1; j <= i; j++)
      s[i][j] = add(s[i - 1][j - 1] + 1ll * j * s[i - 1][j] % M, M);
}

int c[MAXN + 48][MAXN + 48];
inline void init_c() {
  c[0][0] = 1;
  for (register int i = 1; i <= n; i++) {
    c[i][0] = c[i][i] = 1;
    for (register int j = 1; j <= i - 1; j++)
      c[i][j] = add(c[i - 1][j - 1] + c[i - 1][j], M);
  }
}

int main() {
#ifdef LOCAL
  double TIME = clock();
  freopen("a.in", "r", stdin);
  freopen("a.out", "w", stdout);
  cerr << "Running..." << endl;
#endif
  io.Get(n);
  io.Get(M);
  init_stirling();
  init_c();
  int ans = 0;
  for (register int i = 0; i <= n; i++) {
    int pw1 = quick_pow(2, quick_pow(2, n - i, M - 1), M);
    int pw2 = quick_pow(2, n - i, M), pw = 1;
    for (register int j = 0; j <= i; j++) {
      int res = 1ll * add(1ll * (j + 1) * s[i][j + 1] % M + s[i][j], M) * pw %
                M * pw1 % M * c[n][i] % M;
      if (i & 1)
        Sub(ans, res, M);
      else
        Add(ans, res, M);
      pw = 1ll * pw * pw2 % M;
    }
  }
  io.Print(ans, '\n');
  io.flush();
#ifdef LOCAL
  cerr << "Exec Time: " << (clock() - TIME) / CLOCKS_PER_SEC << endl;
#endif
  return 0;
}