Problem p03914 (C++)

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

typedef long long LL;
typedef pair<LL, LL> PII;

LL MOD = 1000000007;
const int MAXN = 310;
LL comb[MAXN][MAXN];

void init() {
  for (int i = 0; i < MAXN; i++) {
    comb[i][i] = comb[i][0] = 1;
  }
  for (int i = 2; i < MAXN; i++) {
    for (int j = 1; j < i; j++) {
      comb[i][j] = comb[i - 1][j - 1] + comb[i - 1][j];
      comb[i][j] %= MOD;
    }
  }
}
//	LL dp[MAXN][MAXN];
//	LL A[MAXN][MAXN];

// LL K[MAXN][MAXN][MAXN];
LL dp[MAXN][MAXN][MAXN];

int main() {
  init();
  int N, M;
  cin >> N >> M;

  dp[1][0][0] = 1;
  for (int j = 0; j <= M; j++) {
    for (int i = 1; i <= N; i++) {
      for (int k = 0; k <= N; k++) {
        LL base = dp[i][j][k];
        dp[i][j + 1][k] += base * (LL)k;
        dp[i + k][j + 1][0] += base * (LL)i;
        dp[i][j + 1][k + 1] += base * (LL)(N - i - k);

        dp[i][j + 1][k] %= MOD;
        if (i + k < MAXN)
          dp[i + k][j + 1][0] %= MOD;
        dp[i][j + 1][k + 1] %= MOD;
      }
    }
  }
  cout << dp[N][M][0] << endl;

  // 変な方針で解こうとしたらO(N^4)になった
  //

  /*
  for(int j=0; j<MAXN; j++)
  for(int i=0; i<MAXN; i++) {
          dp[j][i] = 0;
          A[j][i] = 0;
  }
  A[1][0] = 1;
  dp[0][0] = 1;
  for(int i=1; i<=N; i++) {
          for(int j=1; j<=M; j++) {

                  for(int prev = 0; prev<j; prev++) {
                          dp[i][j] += dp[i-1][prev] * comb[j][prev];
                          dp[i][j] %= MOD;
                  }


          }
  }
  vector<LL> x;
  x.push_back(1);
  for(LL i=0; i<=M; i++) {
          x.push_back( (LL)x.back() * (LL)N % MOD);
          cout << x.back() << endl;
  }


  for(int p=1; p<=N; p++) {
          for(int q=1; q<=M; q++) {
                  A[p][q] += A[p][q-1] * (LL)p;
                  A[p][q] %= MOD;
          }

          for(int q=0; q<=M; q++) {
                  for(int i=1; i+p<=N; i++) {
                          for(int j=1; j+q<=M; j++) {
                          //ここのオーダーが落ちない！！！！！ってなってた。
                                  A[p+i][q+j] += A[p][q] * comb[N-p][i] % MOD *
  dp[i][j-1] % MOD * (LL) p % MOD; A[p+i][q+j] %= MOD;
                          }
                  }
          }
  }
  for(int i=0; i<=N; i++, cout << endl)
          for(int j=0; j<=M; j++) {
                  cout << A[i][j] << " ";
          }

  cout << A[N][M] << endl;
  */

  return 0;
}


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

typedef long long LL;
typedef pair<LL, LL> PII;

LL MOD = 1000000007;
const int MAXN = 310;
LL comb[MAXN][MAXN];

void init() {
  for (int i = 0; i < MAXN; i++) {
    comb[i][i] = comb[i][0] = 1;
  }
  for (int i = 2; i < MAXN; i++) {
    for (int j = 1; j < i; j++) {
      comb[i][j] = comb[i - 1][j - 1] + comb[i - 1][j];
      comb[i][j] %= MOD;
    }
  }
}
//	LL dp[MAXN][MAXN];
//	LL A[MAXN][MAXN];

// LL K[MAXN][MAXN][MAXN];
LL dp[MAXN][MAXN][MAXN];

int main() {
  init();
  int N, M;
  cin >> N >> M;

  dp[1][0][0] = 1;
  for (int j = 0; j <= M; j++) {
    for (int i = 1; i <= N; i++) {
      for (int k = 0; k <= N; k++) {
        LL base = dp[i][j][k];
        dp[i][j + 1][k] += base * (LL)k;
        if (i + k < MAXN)
          dp[i + k][j + 1][0] += base * (LL)i;
        dp[i][j + 1][k + 1] += base * (LL)(N - i - k);

        dp[i][j + 1][k] %= MOD;
        if (i + k < MAXN)
          dp[i + k][j + 1][0] %= MOD;
        dp[i][j + 1][k + 1] %= MOD;
      }
    }
  }
  cout << dp[N][M][0] << endl;

  // 変な方針で解こうとしたらO(N^4)になった
  //

  /*
  for(int j=0; j<MAXN; j++)
  for(int i=0; i<MAXN; i++) {
          dp[j][i] = 0;
          A[j][i] = 0;
  }
  A[1][0] = 1;
  dp[0][0] = 1;
  for(int i=1; i<=N; i++) {
          for(int j=1; j<=M; j++) {

                  for(int prev = 0; prev<j; prev++) {
                          dp[i][j] += dp[i-1][prev] * comb[j][prev];
                          dp[i][j] %= MOD;
                  }


          }
  }
  vector<LL> x;
  x.push_back(1);
  for(LL i=0; i<=M; i++) {
          x.push_back( (LL)x.back() * (LL)N % MOD);
          cout << x.back() << endl;
  }


  for(int p=1; p<=N; p++) {
          for(int q=1; q<=M; q++) {
                  A[p][q] += A[p][q-1] * (LL)p;
                  A[p][q] %= MOD;
          }

          for(int q=0; q<=M; q++) {
                  for(int i=1; i+p<=N; i++) {
                          for(int j=1; j+q<=M; j++) {
                          //ここのオーダーが落ちない！！！！！ってなってた。
                                  A[p+i][q+j] += A[p][q] * comb[N-p][i] % MOD *
  dp[i][j-1] % MOD * (LL) p % MOD; A[p+i][q+j] %= MOD;
                          }
                  }
          }
  }
  for(int i=0; i<=N; i++, cout << endl)
          for(int j=0; j<=M; j++) {
                  cout << A[i][j] << " ";
          }

  cout << A[N][M] << endl;
  */

  return 0;
}