序列的第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^91≤T≤100,1≤a≤b≤c≤109,1≤k≤109。
#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个数的主要内容,如果未能解决你的问题,请参考以下文章