| Run ID | 作者 | 问题 | 语言 | 测评结果 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|
| 85070 | sh25_wangtaojie | 题目的分数值 | C++ | 无测评数据 | 0 MS | 0 KB | 1770 | 2026-03-06 14:51:11 |
#include <iostream> #include <vector> using namespace std; const int MAXN = 5005; long long mod; // 预处理阶乘和逆元 long long fact[MAXN], inv_fact[MAXN]; long long power(long long base, long long exp, long long mod) { long long result = 1; base %= mod; while (exp > 0) { if (exp & 1) result = (result * base) % mod; base = (base * base) % mod; exp >>= 1; } return result; } long long mod_inverse(long long a, long long mod) { return power(a, mod - 2, mod); } void preprocess(int n, long long m) { fact[0] = 1; for (int i = 1; i <= n; ++i) { fact[i] = (fact[i - 1] * i) % m; } inv_fact[n] = mod_inverse(fact[n], m); for (int i = n - 1; i >= 0; --i) { inv_fact[i] = (inv_fact[i + 1] * (i + 1)) % m; } } long long comb(int n, int k) { if (k > n || k < 0) return 0; return (fact[n] * inv_fact[k]) % mod * inv_fact[n - k] % mod; } int main() { int n; cin >> n >> mod; preprocess(n, mod); // dp[i][j] 表示前 i 个问题,总分恰好为 j 的方案数 vector<vector<long long>> dp(n + 1, vector<long long>(n + 1, 0)); dp[0][0] = 1; for (int i = 1; i <= n; ++i) { for (int j = 0; j <= n; ++j) { // 不选第 i 个问题 dp[i][j] = (dp[i][j] + dp[i - 1][j]) % mod; // 选第 i 个问题,分值为 i if (j >= i) { dp[i][j] = (dp[i][j] + dp[i - 1][j - i]) % mod; } } } // 计算满足条件的方案数 long long result = 0; for (int j = 1; j <= n; ++j) { result = (result + dp[n][j]) % mod; } cout << result << endl; return 0; }