0.这是一个快速幂题目
1.答案情况如下:
情况1:若a,b,c是一个等差数列,则第K项是a + (c - b) * (k - 1)
情况2:若a,b,c是一个等比数列,则第K项是a * (b / a) ^ (k - 1) 用快速幂求解。
2.首先第一个问题:是否存在a,b,c,使得a,b,c既是一个等差数列,也是一个等比数列。
证明:
若a,b,c是一个等差数列,则a + c = 2b(1)
若a,b,c是一个等比数列,则a * c = b^2(2)
对(1)两边加平方得到(a + c)^2 = 4 * b^2(3)
联立(3)(4)可得(a - c)^2 = 0;
得证:当且仅当 a = b = c = 1 时该数列既是等差也是等比。
3.第二个问题:第二种情况中(b / a)有没有可能为分数。答案显而易见是不可能的。题中该序列为整数序列。所以如果公比为小数的话,最终也会成为小数,故公比必定为整数。
code:
#include<iostream>#include<cstring>#include<algorithm>usingnamespace std;typedeflonglong LL;constint mod =200907;//快速幂模板 求a^b % mod 的结果
LL qmi(LL a,int b,int mod){
LL res =1;while(b){if(b &1) res =(LL)res * a % mod;
a =(LL)a * a % mod;
b >>=1;}return res;}intmain(){int T;
cin >> T;while(T --){int a, b, c, k;
cin >> a >> b >> c >> k;if(a + c ==2* b) cout <<(a +(LL)(k -1)*(b - a))% mod << endl;//当取极限值的时候 会爆int 所以用long longelse cout <<(LL)a *qmi(b / a, k -1, mod)% mod << endl;}return0;}
总结:
1.分析题目时要分析极限值判断是不是要用long long。
2.int ans = (long long) a * b * .......
在C++语言中,两个数值执行运算时,以参与运算的最高数值类型为准。故,我们必须把其中一个数强制转换为64位整数类型 long long 参与运算,从而得到正确的结果。
最终对mod取模之后,该结果会转换成int存回ans。
3.快速幂模板:
#include<iostream>
using namespace std;
const int mod = 2351512412;
//求快速a^b % mod的结果 时间复杂度O(log n)
int qmi(int a, int b)//也可以将mod以函数参数的形式传入。
{
int res = 1;
while(b)
{
if(b & 1) res = res * a % mod;//当res可能爆int的时候用long long
a = a * a % mod;//当a可能爆int的时候用long long
b >>= 1;
}
return res;
}