题目描述
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
提示
这题首先判断是等比数列还是等差数列,如果c-b==b-a就是等差数列,用到的公式是 第k个数=a+(b-a)*k,对(b-a)*k取模=((b-a)%mod*k%mod)%mod。
如果c/b==b/a,就是等比数列,用到的公式是 第k个数=a*(b/a)^(k-1),套快速幂模板即可。
#include<iostream>
using namespace std;
#define ll long long
#define mod 200907
int quickpow(int a,int b,int n)
{
if(b==1)
return a;
if(b%2==0)
{
ll x=quickpow(a,b/2,n);
return x*x%n;
}
else
{
ll x=quickpow(a,b/2,n);
x=x*x%n;
x=x*a%n;
return x;
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
ll a,b,c,k;
cin>>a>>b>>c>>k;
if(b-a==c-b)
{
ll x=b-a;
cout<<(x%mod*(k-1)%mod)%mod+a<<endl;
}
else
{
ll x=b/a;
cout<<quickpow(x,k-1,mod)*a%mod<<endl;
}
}
return 0;
}