| Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|
| 89076 | sh25_zhangyj | 题目的分数值 | C++ | 无测评数据 | 0 MS | 0 KB | 1494 | 2026-05-22 15:10:11 |
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n; long long m; cin >> n >> m; // dp[i][s] 表示前i个问题,总分和为s的方案数 vector<vector<long long>> dp(n + 1, vector<long long>(n * n + 1, 0)); // 前缀和优化 vector<long long> pre(n * n + 2, 0); // 初始化:第一个问题,A1 ∈ [1, n] for (int a = 1; a <= n; a++) { dp[1][a] = 1; } for (int i = 1; i < n; i++) { // 计算前缀和 pre[0] = 0; for (int s = 0; s <= i * n; s++) { pre[s + 1] = (pre[s] + dp[i][s]) % m; } for (int s = 1; s <= i * n; s++) { if (dp[i][s] == 0) continue; // 第i+1个问题的a必须满足 a > s 且 a <= n int a_min = s + 1; if (a_min > n) continue; // 非递减条件:a >= A_i,这里我们通过dp的定义保证,因为序列是按非递减生成的 // 所以直接从a_min到n的所有a都合法 int a_max = n; // 累加 dp[i][s] 到 dp[i+1][s+a] for (int a = a_min; a <= a_max; a++) { dp[i+1][s + a] = (dp[i+1][s + a] + dp[i][s]) % m; } } } // 答案是所有dp[n][*]的和 long long ans = 0; for (int s = 1; s <= n * n; s++) { ans = (ans + dp[n][s]) % m; } cout << ans << endl; return 0; }