为什么这样?
查看原帖
为什么这样?
1041338
I_Like_Play_Genshin楼主2023/9/28 22:58

如果数组是这样:

#include <iostream>
#define endl '\n'

using namespace std;

const int kMaxN = 2001;

int C[kMaxN][kMaxN], dp[kMaxN][kMaxN], t, k, n, m;

int main() {
  cin >> t >> k;
  for (int i = 1; i <= 2000; i++) {
    C[i][0] = C[i][i] = 1;
  }
  C[1][1] = 1;
  for (int i = 2; i <= 2000; i++) {
    for (int j = 1; j < i; j++) {
      C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % k;
    }
  }
  for (int i = 1; i <= 2000; i++) {
    for (int j = 1; j <= i; j++) {
      dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];
      if (!C[i][j]) {
        ++dp[i][j];
      }
    }
    dp[i][i + 1] = dp[i][i];
  }
  for (int i = 1; i <= t; i++) {
    cin >> n >> m;
    if (m > n) {
      m = n;
    }
    cout << dp[n][m] << "\n";
  }
  return 0;
}

全部WA

如果多开一:

#include <iostream>
#define endl '\n'

using namespace std;

const int kMaxN = 2002;

int C[kMaxN][kMaxN], dp[kMaxN][kMaxN], t, k, n, m;

int main() {
  cin >> t >> k;
  for (int i = 1; i <= 2000; i++) {
    C[i][0] = C[i][i] = 1;
  }
  C[1][1] = 1;
  for (int i = 2; i <= 2000; i++) {
    for (int j = 1; j < i; j++) {
      C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % k;
    }
  }
  for (int i = 1; i <= 2000; i++) {
    for (int j = 1; j <= i; j++) {
      dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];
      if (!C[i][j]) {
        ++dp[i][j];
      }
    }
    dp[i][i + 1] = dp[i][i];
  }
  for (int i = 1; i <= t; i++) {
    cin >> n >> m;
    if (m > n) {
      m = n;
    }
    cout << dp[n][m] << "\n";
  }
  return 0;
}

全部AC

有大佬看一下是为什么吗?

2023/9/28 22:58
加载中...