1 条题解
-
0
思路与算法
先比较b−a和c−b。相同则第k项为a+(k−1)(b−a);否则由整数公比q=b/a得第k项a·q^(k−1),用二进制快速幂对200907取模。
正确性说明
等差列由首项与公差唯一确定;否则按承诺是整数公比等比列,b/a即公比。快速幂维护当前幂与已选二进制位的乘积,每轮平方并处理一位,最终得到正确模幂;模乘保持最终余数。两类均成立时是常数列,先判等差不影响结果。
复杂度
每组等差O(1),等比O(log k),空间O(1);T组总O(T log(max k))。
易错点
k从1计,指数k−1。只有明确的整数公比才能直接b/a;模200907不要求是素数,快速幂不依赖素性。中间乘法用64位。
参考代码(C++11)
#include <bits/stdc++.h> using namespace std; using ll = long long; const ll MOD = 200907; ll power(ll a, ll b) { ll r = 1; for (a %= MOD; b; b >>= 1, a = a * a % MOD) if (b & 1) r = r * a % MOD; return r; } int main() { int T; cin >> T; while (T--) { ll a, b, c, k; cin >> a >> b >> c >> k; if (b - a == c - b) cout << (a % MOD + (k - 1) % MOD * ((b - a) % MOD)) % MOD << '\n'; else cout << a % MOD * power(b / a, k - 1) % MOD << '\n'; } }
- 1