题目
分析
首先要了解:
设有等差数列a,序列公差为d,则
设有等比数列a,序列公比为d,则
但是计算幂的时候,直接计算可能爆long long,需要快速幂。
代码
#include<iostream>
using namespace std;
typedef long long ll;
// 模数
const ll mod = 200907;
// 快速幂
ll qpow(ll b, ll p) {
ll ret = 1;
while (p) {
if (p % 2 == 1) ret = (ret * b % mod) % mod;
b = b * b % mod;
p /= 2;
}
return ret % mod;
}
// 求等差数列第k项,st是第一项,delta是公差
ll calc_arithmetic(ll st, ll delta, ll k) {
return ((k - 1) % mod * delta + st % mod) % mod;
}
// 求等比数列第k项,st是第一项,delta是公比
ll calc_geometric(ll st, ll delta, ll k) {
return (qpow(delta, k - 1) * st % mod) % mod;
}
// 判断序列类型,返回true是等差序列,否则是等比序列
bool check(ll a, ll b, ll c) {
return (b - a) == (c - b);
}
int main(){
int kase; // 测试用例数
cin >> kase;
while (kase--) {
ll a, b, c, n;
cin >> a >> b >> c >> n;
if (check(a, b, c)) cout << calc_arithmetic(a, (b - a) % mod, n) << endl;
else cout << calc_geometric(a, b / a % mod, n) << endl;
}
return 0;
}