问题 B: 序列的第k个数
时间限制: 1 Sec 内存限制: 128 MB
题目描述
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; //二进制除以2 位运算 向右移动一位
}
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;
}
}
}