对于两种序列一种等比,一种等差
如果是等比 ak = a1 + (k - 1) * d 直接用((a1 * mod) + ((k - 1) % mod) * (d % mod)) % mod求就可以了
如果是等差 ak = a1 * q ^(k - 1) 利用快速幂求出q ^(k - 1)可以得到结果
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
int n;
int k;
LL a[5];
LL mod = 200907;
LL pow_mod(LL a,int m){
//printf("%d\n",m);
if(m == 1)
return a % mod;
if(m == 0)
return 1;
LL d = pow_mod(a,m / 2);
LL ans = d * d % mod;
if(m & 1)
ans = ans * a % mod;
return ans;
}
int main(){
scanf("%d",&n);
while(n--){
for(int i = 0; i < 3; i++)
scanf("%I64d",&a[i]);
scanf("%d",&k);
LL ans;
if(a[1] - a[0] == a[2] - a[1]){
ans = ((a[0] % mod) + ((k - 1) % mod) * ((a[1] - a[0]) % mod)) % mod;
printf("%I64d\n",ans);
}
else{
LL d = a[1] / a[0];
ans = ((a[0] % mod) * pow_mod(d,k - 1)) % mod;
printf("%I64d\n",ans);
}
}
return 0;
}
/*
1
1 10 100 1000000000
*/