一.题目链接
二.思路
一共T组测试数据,给出一个数列的前三项a,b,c。判断是等差数列还是等比数列,求该数列的第k项。
- 性质:一个数列既是等差数列又是等比数列 当且仅当 a = b = c。
第一步:判断是等差还是等比
情况1:公差: d = b − a d = b - a d=b−a 答案: a n s = a + ( k − 1 ) d ans = a + (k - 1)d ans=a+(k−1)d
情况2:公比: q = b a q = \frac{b}{a} q=ab 答案: a n s = a ∗ p k − 1 ans = a * p^{k - 1} ans=a∗pk−1
第二步:当为公比的时候,直接用快速幂求解即可。
三.代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int mod = 200907;
typedef long long ll;
//快速幂
int qmi(int a, int b)
{
int res = 1;
while(b)
{
if(b & 1) res = (ll) res * a % mod;
a = (ll)a * a % mod;
b >>= 1;
}
return res;
}
int main()
{
int T;
cin >> T;
while(T --)
{
int a, b, c, k;
scanf("%d%d%d%d", &a, &b, &c, &k);
//判断是否是等差数列
if(a + c == 2 * b) cout << (a + (ll)(k - 1) * (b - a)) % mod << endl;
else
{
cout << (ll)a * qmi((b / a), k - 1) % mod << endl;
}
}
return 0;
}
四.总结
给出数列前三项a,b,c。
- 若为等差数列 当且仅当 a ∗ c = 2 ∗ b a * c = 2 * b a∗c=2∗b
- 若为等比数列 当且仅当 a ∗ c = b 2 a * c = b ^ 2 a∗c=b2
- 等差数列前n项和:
S n = ( a 1 + a n ) n 2 S_n = \frac{(a_1 + a_n)n}{2} Sn=2(a1+an)n
S n = n a 1 + n ( n − 1 ) 2 d S_n = na_1 + \frac{n(n-1)}{2}d Sn=na1+2n(n−1)d - 等比数列前n项和:
S n = a 1 ( 1 − q n ) 1 − q ( q 不等于 1 ) S_n = \frac{a_1(1 - q^n)}{1 - q}(q 不等于 1) Sn=1−qa1(1−qn)(q不等于1)