1. 问题描述:
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
来源:https://www.acwing.com/problem/content/description/1291/
2. 思路分析:
首先我们需要想一个问题,一个数列能否既是等差数列,又是等比数列呢?当数列中的元素都相等的时候此时是成立的,若不是全等数列呢?若数列前三个数字为a,b,c,若为等差数列则2b = a + c,若为等比数列则b ^ 2 = ac,通过化简可以得到(b - c)^ 2 = 0,此时b = c,也可以得到 a = c,所以属于全等数列,所以不存在不是全等的数列使得既是等差数列,又是等比数列,当为全等数列的时候计算哪一个结果都是没有影响的,所以直接使用公式求解即可,因为涉及到x ^ n所以需要使用快速幂来计算结果。
3. 代码如下:
class Solution:
def quickPower(self, x: int, n: int, mod: int):
res = 1
while n > 0:
if n & 1:
res = res * x % mod
x = x * x % mod
n >>= 1
return res
def process(self):
T = int(input())
mod = 200907
for i in range(T):
a, b, c, k = map(int, input().split())
if 2 * b == a + c:
# 说明是等差数列
d = b - a
print((a + (k - 1) * d) % mod)
else:
# 等比数列
print(a * self.quickPower(b // a, k - 1, mod) % mod)
if __name__ == '__main__':
Solution().process()