BSNY 在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列。
现在给你 整数 序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第 k 项的值吗。
如果第 k 项的值太大,对其取模 200907。
输入格式
第一行一个整数 T,表示有 T 组测试数据;
对于每组测试数据,输入前三项 a,b,c,然后输入 k。
输出格式
对于每组数据,输出第 k 项取模 200907 的值。
数据范围
1 ≤ T ≤ 100 , 1 ≤ a ≤ b ≤ c ≤ 1 0 9 , 1 ≤ k ≤ 1 0 9 1≤T≤100, 1≤a≤b≤c≤10^9, 1≤k≤10^9 1≤T≤100,1≤a≤b≤c≤109,1≤k≤109
输入样例:
2
1 2 3 5
1 2 4 5
输出样例:
5
16
分析:
设 给 定 前 三 项 为 a , b , c 。 设给定前三项为a,b,c。 设给定前三项为a,b,c。
等 差 数 列 : a + b = 2 c , 通 项 公 式 : a k = a 1 + ( k − 1 ) d 等差数列:a+b=2c,通项公式:a_k=a_1+(k-1)d 等差数列:a+b=2c,通项公式:ak=a1+(k−1)d
等 比 数 列 : a × c = b 2 , 通 项 公 式 : a k = a 1 q k − 1 等比数列:a×c=b^2,通项公式:a_k=a_1q^{k-1} 等比数列:a×c=b2,通项公式:ak=a1qk−1
问题:
是 否 存 在 某 三 个 数 , 使 得 我 们 无 法 确 定 是 等 差 数 列 还 是 等 比 数 列 , 以 至 于 无 法 计 算 第 k 项 。 是否存在某三个数,使得我们无法确定是等差数列还是等比数列,以至于无法计算第k项。 是否存在某三个数,使得我们无法确定是等差数列还是等比数列,以至于无法计算第k项。
将 a = 2 c − b 带 入 a × b = b 2 将a=2c-b带入a×b=b^2 将a=2c−b带入a×b=b2
得 ( b − c ) 2 = 0 , 即 b = c , 同 理 得 到 a = b = c , 也 就 是 公 差 为 0 的 等 差 数 列 或 公 比 为 1 的 等 比 数 列 。 得(b-c)^2=0,即b=c,同理得到a=b=c,也就是公差为0的等差数列或公比为1的等比数列。 得(b−c)2=0,即b=c,同理得到a=b=c,也就是公差为0的等差数列或公比为1的等比数列。
此 时 我 们 当 作 等 差 数 列 来 处 理 , 求 第 k 项 即 可 。 此时我们当作等差数列来处理,求第k项即可。 此时我们当作等差数列来处理,求第k项即可。
代码:
#include
#define ll long long
using namespace std;
const int mod=200907;
ll quick_pow(ll a,ll b,int mod)
{
ll res=1;
while(b)
{
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
int main()
{
int T;
ll a,b,c,k;
cin>>T;
while(T--)
{
cin>>a>>b>>c>>k;
if(a+c==2*b) cout<<(a+(b-a)*(k-1))%mod<<endl;
else cout<<a*quick_pow((b/a),k-1,mod)%mod<<endl;
}
return 0;
}