1. 问题分析与优化思路
这道题目要求我们计算多个大数幂次的和再取模,直接暴力计算显然会超时。我们先分析原始代码的问题所在:
原始代码虽然使用了快速幂算法,但在处理大规模数据时仍然会超时(TLE)。原因在于:
- 每组测试数据可能有高达45000对(Ai,Bi)
- 每对(Ai,Bi)都需要单独计算快速幂
- 虽然快速幂的时间复杂度是O(logb),但当H很大时,整体复杂度O(Hlogb)仍然可能超时
1.1 快速幂算法回顾
快速幂算法是解决大数幂次取模问题的经典方法。其核心思想是通过二分法将幂次运算的时间复杂度从O(n)降低到O(logn):
cpp复制int fastPow(int a, int b, int mod) {
int res = 1 % mod;
a %= mod;
while (b) {
if (b & 1) res = res * a % mod;
a = a * a % mod;
b >>= 1;
}
return res;
}
这个算法通过不断平方底数a,并在二进制位为1时将结果乘入res,有效减少了乘法次数。
1.2 性能瓶颈分析
原始代码的问题不在于快速幂的实现,而在于:
- 输入输出效率:使用cin/cout而没有关闭同步,或者使用scanf但仍有优化空间
- 循环效率:while循环比for循环在某些编译器上效率略低
- 中间变量:使用了不必要的中间变量sum和res
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 优化方案实现
2.1 输入输出优化
在C++中,对于大规模数据输入输出,我们有几种优化方案:
cpp复制// 方案1:使用scanf/printf
#include <cstdio>
// 方案2:优化cin/cout
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
经过测试,在本题中使用scanf/printf比优化后的cin/cout略快。
2.2 循环优化
将while循环改为for循环,并减少循环内的操作:
cpp复制for (int i = 0; i < H; ++i
