题目描述
BSNY在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列。现在给你序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第k项的值吗。如果第k项的值太大,对200907取模。
输入描述:
第一行一个整数T,表示有T组测试数据;
对于每组测试数据,输入前三项a,b,c,然后输入k。
输出描述:
对于每组数据输出第k项的值,对200907取模。
示例1
输入
2
1 2 3 5
1 2 4 5
输出
5
16
说明
第一组是等差序列,第二组是等比数列。
备注:
对于全部数据,1≤T≤100,1≤a≤b≤c≤ 1 0 9 10^9 109,1≤k≤ 1 0 9 10^9 109 。
思路:
很基础的快速幂题目,不会快速幂的看一下这两篇:
(1)快速幂详解
(2)牛客网 64位整数乘法
AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
const int Mod=200907;
bool IsDengBi(int a,int b,int c){
if(a*c==b*b) return true;
return false;
}
int DengBi(int a,int Bi,int k){
LL base=Bi,ans=a;
while(k){
if(k&1) ans=(ans*base)%Mod;
base=(base*base)%Mod;
k=k>>1;
}
return ans;
}
int DengCha(int a,int cha,int k){
LL base=cha,ans=a;
while(k){
if(k&1) ans=(ans+base)%Mod;
base=(base+base)%Mod;
k=k>>1;
}
return ans;
}
int main(){
int T;
scanf("%d",&T);
int a,b,c,k;
while(T--){
scanf("%d%d%d%d",&a,&b,&c,&k);
if(IsDengBi(a,b,c)) printf("%d\n",DengBi(b,c/b,k-2));
else printf("%d\n",DengCha(a,b-a,k-1));
}
return 0;
}