序列的第k个数

题目 序列的第k个数

BSNY 在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列。

现在给你 整数 序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第 k 项的值吗。

如果第 k 项的值太大,对其取模 200907。

输入格式 第一行一个整数 T,表示有 T 组测试数据;

对于每组测试数据,输入前三项 a,b,c,然后输入 k。

输出格式 对于每组数据,输出第 k 项取模 200907 的值。

数据范围 1≤T≤100, 1≤a≤b≤c≤10^9, 1≤k≤10^9

输入样例: 2 1 2 3 5 1 2 4 5

输出样例: 5 16

思路分析

暴力模拟 因为题目说了 数据要么是等差要么是等比 不会出现即是又是 都不是的情况

所以能首先根据前三项确定是等差还是等比 再根据等差数列 等比数列 第n项的公式求得解

#include<bits/stdc++.h>

using namespace std;

int main()

{

    int T;cin>>T;

    while(T--){

        int a1,a2,a3,n;

        cin>>a1>>a2>>a3>>n;

        if(a3-a2==a2-a1){

            //cout<<"等差"<<endl;//an=a1+(n-1)d

            int d=a3-a2;

            cout<<a1+(n-1)*d<<endl;

        }

        else if(a3/a2==a2/a1){

            // cout<<"等比"<<endl;//a1*q^(n-1)

            int q=a3/a2;

            cout<<a1*(pow(q,n-1))<<endl;

        }

    }

    return 0;

}

提高课的题 没买进不去 测试不了能过几个数据

优化:

一个数列,如果既是等差数列,有是等比数列,那么这个数列必然是恒等序列

证明:(利用等差、等比中项)

image-828c0436

等差、等比对应两类情况

337a9ef5234b993b4030c80103e1d788-acaf5fe5
#include<bits/stdc++.h>

using namespace std;
#define int long long
const int mod = 200907;
int t,a,b,c,k;

int qmi(int a,int b)
{
    int res = 1;
    while(b){
        if(b&1)
            res = res * a % mod;
        b>>=1;
        a = a * a % mod;
    }
    return res;
}

signed main()
{
    cin>>t;
    while(t--){
        cin>>a>>b>>c>>k;
        if(a+c==2*b)
            cout << (a + (b - a) * (k - 1) % mod) % mod << endl;
        else if(a*c==b*b)
            cout<< a * qmi(b / a, k - 1) % mod<<endl;
    }

    return 0;
}

乐 这就是数论呢 考试的时候回忆得起两个公式就谢天谢地了

代码实现


同类题型

视频讲解


⬅️ 基本用法 🏠 00-刷题理模型 ➡️ 越狱