解决代码WA问题:优化能量总和计算方法
### 🐞问题分析 代码出现 `WA`(Wrong Answer)可能是因为在计算过程中出现了整数溢出问题,虽然使用了 `long long` 类型来存储部分结果,但在取模操作之前仍然可能会发生溢出。代码本身逻辑是正确的,不过可以通过数学推导来优化计算过程,避免双重循环,从而减少时间复杂度。 ### 💡优化思路 我们可以使用数学公式来优化计算。假设数组 `a` 的元素为 \(a_1, a_2, \cdots, a_n\),我们要求的是 \(\sum_{1\leq i < j\leq n} a_i\times a_j\)。 根据完全平方公式 \((a_1 + a_2+\cdots+a_n)^2=\sum_{i = 1}^{n}a_i^2 + 2\sum_{1\leq i < j\leq n} a_i\times a_j\),可以推导出 \(\sum_{1\leq i < j\leq n} a_i\times a_j=\frac{(\sum_{i = 1}^{n}a_i)^2-\sum_{i = 1}^{n}a_i^2}{2}\)。 ### 📝修改后的代码 ```cpp #include <iostream> const int MOD = 1000000007; // 计算汇合后的新能量总和 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的模逆元 // 2在模1000000007下的逆元是500000004 result = result * 500000004 % MOD; return result; } int main() { int n; std::cin >> n; 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. **计算总和与平方和**:通过一次遍历数组,计算所有能量波强度的和 `sum` 以及平方和 `squareSum`,并在计算过程中进行取模操作,避免溢出。 2. **根据公式计算结果**:根据前面推导的公式,计算 \((\sum_{i = 1}^{n}a_i)^2-\sum_{i = 1}^{n}a_i^2\),并进行取模操作。 3. **处理除法**:在模运算中不能直接进行除法,需要乘以除数的模逆元。因为 \(2\times500000004\equiv1\pmod{1000000007}\),所以乘以 \(500000004\) 相当于除以 \(2\)。 ### 🔍复杂度分析 - **时间复杂度**:\(O(n)\),只需要遍历一次数组。 - **空间复杂度**:\(O(n)\),主要用于存储输入的数组。 ######[AI问答 | 904点数解答 | 2026-05-31 16:04:07]
- 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
- 解析React 15与Vue 2:从O(n^3)到O(n),Diff算法时间复杂度计算及性能对比 (阿里通义 | 379点数解答 | 2023-11-09 01:49:19)367
- 缜密逻辑,全新无名杀“风餐”技能代码精心打造与深度解析 (字节豆包 | 469点数解答 | 2025-04-05 11:37:06)292
- 精准优化:明确需求,开启高效提升之旅! (字节豆包 | 52点数解答 | 2026-02-09 16:44:46)86
- 代码再升级:优化版“获取dump”代码,多机制保障数据读取与保存(字节豆包 | 734点数解答 | 2026-02-10 01:23:31)96
- 代码深度优化:全面检查异常、灵活读取内存,提升可读性与可维护性(字节豆包 | 959点数解答 | 2026-02-10 01:24:14)70
- 破解Jenkins构建Java项目“数据收集等待过长”难题的实用攻略( | 389点数解答 | 2024-01-18 09:27:30)347