快速幂 - 序列的第k个数 - AcWing 1289

快速幂 - 序列的第k个数 - AcWing 1289

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 1T100,1abc109,1k109

输入样例:

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+(k1)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=a1qk1

问题:

是 否 存 在 某 三 个 数 , 使 得 我 们 无 法 确 定 是 等 差 数 列 还 是 等 比 数 列 , 以 至 于 无 法 计 算 第 k 项 。 是否存在某三个数,使得我们无法确定是等差数列还是等比数列,以至于无法计算第k项。 使k

将 a = 2 c − b 带 入 a × b = b 2 将a=2c-b带入a×b=b^2 a=2cba×b=b2

得 ( b − c ) 2 = 0 , 即 b = c , 同 理 得 到 a = b = c , 也 就 是 公 差 为 0 的 等 差 数 列 或 公 比 为 1 的 等 比 数 列 。 得(b-c)^2=0,即b=c,同理得到a=b=c,也就是公差为0的等差数列或公比为1的等比数列。 (bc)2=0b=ca=b=c01

此 时 我 们 当 作 等 差 数 列 来 处 理 , 求 第 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;
}

你可能感兴趣的:(数学,算法,数论,快速幂,ACM)