题目描述
BSNY 在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列。现在给你序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第 k 项的值吗。 如果第 k 项的值太大,对 200907 取模。
输入
第一行一个整数 T,表示有 T 组测试数据;
对于每组测试数据,输入前三项 a,b,c,然后输入 k。
对于全部数据,1<=T<=100,1<=a<=b<=c<=109,1<=k<=109
输出
对于每组数据输出第 k 项的值,对 200907 取模。
样例输入
2
1 2 3 5
1 2 4 5
样例输出
5
16
提示
[提交][状态]
#include<iostream>
using namespace std;
typedef long long ll;
ll qpow(ll a,ll b,ll c)//快速幂
{
ll sum=1;
while(b>0)
{
if(b&1)
{
sum=sum*a%c;
}
a=a*a%c;
b>>=1;
}
return sum;
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
ll a,b,c,k;
cin>>a>>b>>c>>k;
if((a-b)==(b-c)) cout<<a+(((k-1)%200907)*((b-a)%200907)%200907)<<endl;
else {
ll x=b/a;
cout<<((a%200907)*(qpow(x,k-1,200907)%200907))%200907<<endl;//防止益处
}
}
}