Problem p04013 (C++)

Buggy submission (status: Memory Limit Exceeded):
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cstdlib>
#include <ctype.h>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
#include <time.h>
#include <tuple>
#include <vector>
using namespace std;
// #define int long long
#define rep(i, s, n) for (int i = s; i < n; i++)
#define repe(i, s, n) for (int i = s; i <= n; i++)
#define rrep(i, s, n) for (int i = (n)-1; i >= (s); i--)
#define all(v) (v).begin(), (v).end()
#define pb push_back
#define fi first
#define se second
#define chmin(a, b) a = min((a), (b))
#define chmax(a, b) a = max((a), (b))
#define l1 list[index]
#define l2 list[index - 1]
#define l3 list[index + 1]
#define iif(i, j) ((i < 0 && j < 0) || (i > 0 && j > 0)) ? true : false
typedef long long ll;
typedef pair<int, int> pint;
typedef vector<int> vint;
typedef vector<pint> vpint;
typedef pair<pint, int> P1;
typedef pair<int, pint> P2;
typedef pair<pint, pint> PP;
static const ll maxLL = (ll)1 << 62;
const ll MOD = 1000000007;
const ll INF = 1e18;
const double PI = 3.14159265359;
int ca[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

// 入力
ll n, A;
ll a[110];

// DPテーブル
ll dp[110][110][10010];

signed main() {
  ll cnt = 0, maxn = 0;

  cin >> n >> A;
  for (int i = 0; i < n; ++i) {
    cin >> a[i];
    maxn += a[i];
  }

  memset(dp, 0, sizeof(dp)); // 一旦すべて 0 に
  dp[0][0][0] = 1;           // dp[0][0] だけ 1 に

  for (int i = 0; i < n; ++i) {
    for (int j = 0; j <= n; ++j) {
      for (int k = 0; k <= 2600; k++) {
        dp[i + 1][j][k] += dp[i][j][k];
        // if (j >= a[i]) (dp[i + 1][j] += dp[i][j - a[i]]) %= MOD;
        if (k >= a[i])
          (dp[i + 1][j + 1][k] += dp[i][j][k - a[i]]);
      }
    }
  }

  // cout << dp[n][A] << endl;

  for (int i = 1; i <= n; i++) {
    cnt += dp[n][i][i * A];
  }

  cout << cnt << endl;

  return 0;
}

Fixed submission:
#include <algorithm>
#include <bitset>
#include <cctype>
#include <cstdlib>
#include <ctype.h>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdio.h>
#include <string.h>
#include <string>
#include <time.h>
#include <tuple>
#include <vector>
using namespace std;
// #define int long long
#define rep(i, s, n) for (int i = s; i < n; i++)
#define repe(i, s, n) for (int i = s; i <= n; i++)
#define rrep(i, s, n) for (int i = (n)-1; i >= (s); i--)
#define all(v) (v).begin(), (v).end()
#define pb push_back
#define fi first
#define se second
#define chmin(a, b) a = min((a), (b))
#define chmax(a, b) a = max((a), (b))
#define l1 list[index]
#define l2 list[index - 1]
#define l3 list[index + 1]
#define iif(i, j) ((i < 0 && j < 0) || (i > 0 && j > 0)) ? true : false
typedef long long ll;
typedef pair<int, int> pint;
typedef vector<int> vint;
typedef vector<pint> vpint;
typedef pair<pint, int> P1;
typedef pair<int, pint> P2;
typedef pair<pint, pint> PP;
static const ll maxLL = (ll)1 << 62;
const ll MOD = 1000000007;
const ll INF = 1e18;
const double PI = 3.14159265359;
int ca[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

// 入力
ll n, A;
ll a[110];

// DPテーブル
ll dp[52][52][2600];

signed main() {
  ll cnt = 0, maxn = 0;

  cin >> n >> A;
  for (int i = 0; i < n; ++i) {
    cin >> a[i];
    maxn += a[i];
  }

  memset(dp, 0, sizeof(dp)); // 一旦すべて 0 に
  dp[0][0][0] = 1;           // dp[0][0] だけ 1 に

  for (int i = 0; i < n; ++i) {
    for (int j = 0; j <= n; ++j) {
      for (int k = 0; k <= 2600; k++) {
        dp[i + 1][j][k] += dp[i][j][k];
        // if (j >= a[i]) (dp[i + 1][j] += dp[i][j - a[i]]) %= MOD;
        if (k >= a[i])
          (dp[i + 1][j + 1][k] += dp[i][j][k - a[i]]);
      }
    }
  }

  // cout << dp[n][A] << endl;

  for (int i = 1; i <= n; i++) {
    cnt += dp[n][i][i * A];
  }

  cout << cnt << endl;

  return 0;
}