题目描述
BSNY 在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列。现在给你序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第 k k k 项的值吗。 如果第 k k k 项的值太大,对 200907 200907 200907 取模。
输入格式
第一行一个整数 T T T,表示有 T T T 组测试数据;
对于每组测试数据,输入前三项 a , b , c a,b,c a,b,c,然后输入 k k k。
输出格式
对于每组数据输出第 k k k 项的值,对 200907 200907 200907 取模。
样例
样例输入
2
1 2 3 5
1 2 4 5
样例输出
5
16
样例说明
第一组是等差序列,第二组是等比数列。
数据范围与提示
对于全部数据, 1 ≤ T ≤ 100 , 1 ≤ a ≤ b ≤ c ≤ 1 0 9 , 1 ≤ k ≤ 1 0 9 1\le T\le 100,1\le a\le b\le c\le 10^9,1\le k\le 10^9 1≤T≤100,1≤a≤b≤c≤109,1≤k≤109。
就是一个通项公式和快速幂。
#include<cstdio>
typedef long long ll;
const int mod=200907;
int t;
ll a,b,c,k;
ll qpow(ll x,ll y)
{
ll ret=1;x%=mod;
while(y)
{
if(y&1)ret=ret*x%mod;
x=x*x%mod;
y>>=1;
}
return ret;
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld%lld%lld",&a,&b,&c,&k);
if(a+c==2*b)printf("%lld\n",(a%mod+((k-1)%mod)*(b-a)%mod)%mod);
else printf("%lld\n",(a%mod)*qpow(b/a,k-1)%mod);
}
return 0;
}
总结
板子题