能量波(加强版)代码优化与功能解析
### 🍭代码功能解释 这段代码的主要功能是计算 n 股能量波汇合后的新能量总和,并将结果对 `1000000007` 取模。以下是代码的详细解释: 1. **`modInverse` 函数**:使用扩展欧几里得算法计算 `a` 在模 `m` 下的逆元。在模运算中,不能直接进行除法,需要乘以除数的模逆元。 2. **`calculateTotalEnergy` 函数**: - 计算所有能量波强度的和 `sum` 以及平方和 `squareSum`。 - 根据公式 `(sum * sum - squareSum) / 2` 计算结果,但在模运算中不能直接除以 2,需要乘以 2 的模逆元。 3. **`main` 函数**: - 读取输入的 `n` 和每个能量波的强度。 - 调用 `calculateTotalEnergy` 函数计算汇合后的新能量总和,并输出结果。 ### 🌟代码优化建议 - **输入验证**:代码中已经对输入的 `n` 和 `a[i]` 进行了合法性检查,但可以进一步优化错误处理,例如输出更详细的错误信息。 - **内存管理**:使用动态数组 `new int[n]` 分配内存,需要手动释放内存。可以考虑使用 `std::vector` 来管理内存,避免手动释放内存的问题。 ### 📝优化后的代码 ```cpp #include <iostream> #include <vector> 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, const std::vector<int>& a) { long long sum = 0; // 存储所有能量波强度的和 long long squareSum = 0; // 存储所有能量波强度平方的和 // 计算所有能量波强度的和以及平方和 for (int i = 0; i < n; ++i) { // 确保输入的 a[i] 是合法的 if (a[i] < 0) { return 0; } sum = (sum + a[i]) % MOD; // 避免乘法溢出 squareSum = (squareSum + (long long)a[i] * a[i] % MOD) % 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::cerr << "Error: n must be a positive integer." << std::endl; return 1; } std::vector<int> a(n); // 读取每个能量波的强度 for (int i = 0; i < n; ++i) { std::cin >> a[i]; if (a[i] < 0) { std::cerr << "Error: Energy wave intensity must be non-negative." << std::endl; return 1; } } // 计算并输出汇合后的新能量总和 std::cout << calculateTotalEnergy(n, a) << std::endl; return 0; } ``` ### 🔍复杂度分析 - **时间复杂度**:$O(n)$,其中 $n$ 是能量波的数量。主要时间开销在于遍历数组计算 `sum` 和 `squareSum`。 - **空间复杂度**:$O(n)$,主要用于存储能量波的强度。 ######[AI问答 | 1090点数解答 | 2026-05-31 16:17:09]
- Python 实现简易密码设置系统:多种功能交互与安全要点揭秘(字节豆包 | 286点数解答 | 2025-03-28 10:43:21)397
- C语言实现多功能密码设置系统:含代码及安全注意要点(字节豆包 | 414点数解答 | 2025-03-28 10:43:55)381
- C 语言实现:超简单密码设置系统,含代码与注意要点!(字节豆包 | 519点数解答 | 2025-03-28 12:42:02)421
- C语言实现密码管理系统:含功能代码与安全注意事项(字节豆包 | 409点数解答 | 2025-04-05 18:09:56)365
- C语言实现多功能密码系统:初始化、确认、设置、显示、重置与退出(字节豆包 | 454点数解答 | 2025-04-05 18:48:42)368
- C语言实现密码管理系统:含初始化、确认、设置、显示、重置及退出功能(字节豆包 | 413点数解答 | 2025-04-06 15:37:16)314
- C 语言实现密码管理系统:含初始化、确认、设置、显示、重置及退出功能(字节豆包 | 403点数解答 | 2025-04-06 15:37:54)326
- Golang开发:解析JSON数据时数值默认类型及示例解析(百度文心 | 393点数解答 | 2023-11-09 18:13:06)327
- SQL Working Areas Sizing: Manual vs. Automatic Policy - A Comprehensive Analysis(阿里通义 | 530点数解答 | 2024-05-13 10:55:58)343
- 用C++解决能量波(加强版)问题(字节豆包 | 520点数解答 | 2026-05-31 16:03:15)4
- 修改代码解决“能量波(加强版)”计算问题(字节豆包 | 562点数解答 | 2026-05-31 18:26:10)6
- 解析React 15与Vue 2:从O(n^3)到O(n),Diff算法时间复杂度计算及性能对比 (阿里通义 | 379点数解答 | 2023-11-09 01:49:19)367