分析
-
等差数列:如果首项为$a_1$,公差为
d
,则 $a_n = a_1 + (n - 1) \times d$。 -
等比数列:如果首项为$a_1$,公比为
q
,则 $a_n = a_1 \times q ^ {n - 1}$。 -
输入的序列是否可能既是等差数列,又是等比数列呢?这种可能性是存在的,当且仅当输入的前三项全部相等时,才可能既是等差数列,又是等比数列。证明如下:假设前三项是
a、b、c
,则因为既是等差数列,又是等比数列,有:
$$ \begin{cases} 2 \times b = a + c \quad (1) \\\\ b ^ 2 = a \times c \quad (2) \end{cases} $$
将(1)式中的b
值带入到(2)式,化简可以得到:$(a - c) ^ 2 = 0$,因此a == c
,所以三项都是相等的。
-
因此既是等差数列,又是等比数列,最后第
k
项计算出来的结果是一样的。 -
另外如果这个序列是等比数列,其公比为$q = \frac{b}{a} = \frac{b’}{a’}, (a’, b’)=1$,即
q
的最简分数形式为$\frac{b’}{a’}$,则
$$ a_n = a_1 \times q ^ {n - 1} = \frac{a_1 \times b’ ^ {\ n - 1}}{a’ ^ {\ n - 1}} $$
因为n
可以任意大,且$a_n$是整数,所以a'
必定为1,因此公比q
必定是整数,可以使用快速幂求解$a_n$。
代码
#include <iostream>
using namespace std;
typedef long long LL;
const int mod = 200907;
int qmi(int a, int k) {
int res = 1 % mod;
while (k) {
if (k & 1) res = (LL)res * a % mod;
a = (LL)a * a % mod;
k >>= 1;
}
return res;
}
int main() {
int n;
cin >> n;
while (n--) {
int a, b, c, k;
cin >> a >> b >> c >> k;
if (b * 2 == a + c) cout << (a + (b - a) * (LL)(k - 1)) % mod << endl;
else cout << (a * qmi(b / a, k - 1)) % mod << endl;
}
return 0;
}