解决代码WA问题:修改组合数计算及消除重复排列逻辑
### 🐞问题分析 原代码出现“WA”(Wrong Answer)可能是因为在计算组合数和最终结果时存在逻辑错误。具体来说,原代码在消除堆之间的重复排列时,对 `fastPow(fastPow(m, m), MOD - 2)` 的使用可能有误,这里应该是 `inv[m]` 用于消除 `m` 个堆的重复排列。 ### ✅修改后的代码 ```cpp #include <iostream> using namespace std; const int MOD = 1e9 + 7; const int MAXN = 1005; // 假设最大的 n 和 m 不超过 1000 long long fact[MAXN]; // 阶乘数组 long long inv[MAXN]; // 阶乘逆元数组 // 快速幂函数,用于计算 a^b % MOD long long fastPow(long long a, long long b) { long long res = 1; while (b > 0) { if (b & 1) { res = (res * a) % MOD; } a = (a * a) % MOD; b >>= 1; } return res; } // 预处理阶乘和阶乘逆元 void preprocess() { fact[0] = 1; for (int i = 1; i < MAXN; ++i) { fact[i] = (fact[i - 1] * i) % MOD; } inv[MAXN - 1] = fastPow(fact[MAXN - 1], MOD - 2); for (int i = MAXN - 2; i >= 0; --i) { inv[i] = (inv[i + 1] * (i + 1)) % MOD; } } // 计算组合数 C(n, k) % MOD long long combination(int n, int k) { if (k > n) return 0; return (fact[n] * inv[k] % MOD * inv[n - k]) % MOD; } int main() { preprocess(); // 预处理阶乘和阶乘逆元 int n, m; cin >> n >> m; long long ans = 1; int total = n * m; for (int i = 0; i < m; ++i) { ans = (ans * combination(total, n)) % MOD; total -= n; } // 消除堆之间的重复排列 ans = (ans * inv[m]) % MOD; cout << ans << endl; return 0; } ``` ### 📝代码解释 1. **快速幂函数 `fastPow`**:用于计算 `a^b % MOD`,采用二进制快速幂算法,时间复杂度为 $O(log b)$。 2. **预处理函数 `preprocess`**:预处理阶乘和阶乘逆元数组,方便后续计算组合数。 3. **组合数函数 `combination`**:根据组合数公式 $C(n, k)=\frac{n!}{k!(n - k)!}$ 计算组合数 $C(n, k) \% MOD$。 4. **主函数 `main`**:读取输入的 `n` 和 `m`,计算将 `n * m` 个元素分成 `m` 堆,每堆 `n` 个元素的方案数,最后消除堆之间的重复排列。 ######[AI问答 | 821点数解答 | 2026-05-31 15:32:57]
- 深入解析格雷码生成算法:递归求解与代码实现(DeepSeek | 443点数解答 | 2026-01-05 12:21:49)81
- C3期末:精准求解 3 - 20 范围内数列第 k 项值及注意要点(字节豆包 | 242点数解答 | 2025-06-15 11:26:19)171
- C++求解:查找3 - 20项数列第k项值及注意要点(字节豆包 | 325点数解答 | 2025-06-15 11:27:11)195
- 仅 22%通过率!判断 ac 字符串,Python 代码及边界处理揭秘(字节豆包 | 163点数解答 | 2024-12-13 21:40:55)151
- 仅22%通过率!C++判断ac字符串,这些异常情况你考虑到了吗?(字节豆包 | 279点数解答 | 2024-12-13 21:41:09)153
- 仅22%通过率!C++ 判断字符串是否为 ac 字符串,附代码与注意点(字节豆包 | 265点数解答 | 2024-12-13 21:41:48)118
- 2025年截止提交项目得零分!C语言五大错误深度剖析与解决方案 (字节豆包 | 857点数解答 | 2025-07-10 21:26:21)188
- C语言实现:精准筛选并打印510以内的合数(百度文心 | 540点数解答 | 2024-11-16 16:12:03)87
- C 语言实现:轻松筛选 5 - 10 之间的合数并打印(字节豆包 | 160点数解答 | 2024-11-16 16:17:24)89
- 编程求解:数字币面值累加不同结果及合数数量(字节豆包 | 227点数解答 | 2025-11-22 20:47:55)37
- Python编程:求解数字币面值累加不同结果与合数数量(字节豆包 | 221点数解答 | 2025-11-22 20:48:51)30
- 编程求解:数字币任选累加和的不同结果数与合数个数(字节豆包 | 230点数解答 | 2025-11-30 10:29:20)31