序列的第k个数

Posted HighLights

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列的第k个数相关的知识,希望对你有一定的参考价值。

题目描述 

BSNY在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列。现在给你序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第k项的值吗。如果第k项的值太大,对200907取模。

输入描述:

第一行一个整数T,表示有T组测试数据;
对于每组测试数据,输入前三项a,b,c,然后输入k。

输出描述:

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

输入

2
1 2 3 5
1 2 4 5

输出

5
16

说明

第一组是等差序列,第二组是等比数列。

备注:

对于全部数据,1 \leq T \leq 100,1 \leq a \leq b \leq c \leq 10^9,1 \leq k \leq 10^91T100,1abc109,1k109。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MOD = 200907;
LL msc(LL a, LL b) {
    LL ans = 0;
    while (b) {
        if (b & 1) ans = (ans + a) % MOD;
        b >>= 1;
        a = (a + a) % MOD;
    }
    return ans;
}
LL ksm(LL a, LL b) {
    LL ans = 1;
    while (b) {
        if (b & 1) ans = (ans * a) % MOD;
        b >>= 1;
        a = (a * a) % MOD;
    }
    return ans;
}
LL arithmetic(LL first, LL k, LL d) {
    return (first + msc(--k, d)) % MOD;
}
LL proportional(LL first, LL k, LL q) {
    return msc(first, ksm(q, k - 1));
}
int main() {
    LL a, b, c, k;
    int t;
    cin >> t;
    while (t--) {
        cin >> a >> b >> c >> k;
        if (c - b == b - a) {
            LL d = c - b;
            cout << arithmetic(a, k, d) << endl;
        }
        else {
            LL q = c / b;
            cout << proportional(a, k, q) << endl;
        }
    }
    return 0;
}

以上是关于序列的第k个数的主要内容,如果未能解决你的问题,请参考以下文章

序列的第k个数(快速幂)

序列的第k个数(快速幂)

一本通 1615:例 1序列的第 k 个数

1289. 序列的第k个数快速幂

loj10193. 「一本通 6.1 例 1」序列的第 k 个数

算法:平衡树求第k大数 Sm 前段时间刚学会了用快速排序来求一个列中的第 k大数,可是她觉得每次 序列被改变