考虑到时间和空间限制,暴力的方法时间复杂度肯定会超过,所以我们先通过数学推导简化计算过程:
,
那么对于 𝑔(𝑥)g(x) 当 𝑥>1x>1 时:
根据以上推导,可以在常数时间内计算出 𝑔(𝑥)g(x) 的值。下面是优化后的代码:
#include<bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
long long f(long long a, long long x) {
return (a * x) % MOD;
}
long long g(long long a, long long x) {
if (x == 1) {
return f(a, x);
} else {
// 计算f(f(i))的和
long long a2 = (a * a) % MOD;// 预计算a^2
long long sum_i = ((x - 1) * x / 2) % MOD;
return (a2 * sum_i) % MOD;
}
}
int main() {
int n;
cin >> n;
vector<pair<long long, long long>> vi(n);
for (int i = 0; i < n; i++) {
cin >> vi[i].first >> vi[i].second;
}
for (const auto& tt : vi) {
cout << g(tt.first, tt.second) << endl;
}
return 0;
}