酷代码 AI
菜单
服务商

解决代码WA问题:能量波汇合新能量总和计算代码优化

### 🐞问题分析 代码出现 `WA`(Wrong Answer)可能是因为以下原因: 1. **输入范围问题**:代码假设输入的 `n` 是合法的,但没有对输入进行有效性检查。 2. **数据类型问题**:虽然使用了 `long long` 来处理中间结果,但仍需确保在整个计算过程中不会出现溢出。 3. **逆元计算**:代码中直接使用了 2 在模 `1000000007` 下的逆元 `500000004`,虽然这是正确的,但可以通过扩展欧几里得算法动态计算逆元,提高代码的通用性。 ### ✅修改后的代码 ```cpp #include <iostream> const int MOD = 1000000007; // 扩展欧几里得算法求逆元 int modInverse(int a, int m) { int m0 = m, t, q; int x0 = 0, x1 = 1; if (m == 1) return 0; while (a > 1) { // q 是商 q = a / m; t = m; // m 是余数 m = a % m, a = t; t = x0; x0 = x1 - q * x0; x1 = t; } // 确保结果为正 if (x1 < 0) x1 += m0; return x1; } // 计算汇合后的新能量总和 long long calculateTotalEnergy(int n, int a[]) { long long sum = 0; // 存储所有能量波强度的和 long long squareSum = 0; // 存储所有能量波强度平方的和 // 计算所有能量波强度的和以及平方和 for (int i = 0; i < n; ++i) { sum = (sum + a[i]) % MOD; squareSum = (squareSum + (long long)a[i] * a[i]) % MOD; } // 根据公式计算结果 long long result = (sum * sum % MOD - squareSum + MOD) % MOD; // 因为要除以2,而在模运算中不能直接除,需要乘以2的模逆元 int inv2 = modInverse(2, MOD); result = result * inv2 % MOD; return result; } int main() { int n; std::cin >> n; // 检查输入的 n 是否合法 if (n <= 0) { std::cout << 0 << std::endl; return 0; } int *a = new int[n]; // 读取每个能量波的强度 for (int i = 0; i < n; ++i) { std::cin >> a[i]; } // 计算并输出汇合后的新能量总和 std::cout << calculateTotalEnergy(n, a) << std::endl; delete[] a; return 0; } ``` ### 💡代码解释 1. **`modInverse` 函数**:使用扩展欧几里得算法计算 `a` 在模 `m` 下的逆元。 2. **`calculateTotalEnergy` 函数**:计算所有能量波强度的和以及平方和,然后根据公式计算结果。在除以 2 时,使用 `modInverse` 函数计算 2 的逆元。 3. **`main` 函数**:读取输入的 `n` 和每个能量波的强度,调用 `calculateTotalEnergy` 函数计算结果并输出。对输入的 `n` 进行有效性检查,避免非法输入。 ######[AI问答 | 901点数解答 | 2026-05-31 16:08:11]

相关提问
本站限时免费提问中
实用工具查看更多
Linux在线手册 [开发类]
Jquery在线手册 [开发类]
今日油价 [生活类]
图片互转base64 [开发类]
时间转换器 [开发类]