题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2817
题面:
思路:
这道题目中给出一个序列的前三项,让你求第k项,我们可以得知这个序列不是一个等差数列就是一个等比数列,然后求出第k项,我们等差数列可以使用等差数列的通项公式就可以快速的得到答案,而等比数列如果我们通过通项公式来得到答案的,会超时,因为题目中的数据范围给的特别大,如果我们一个个乘过去,就容易超时,使用这道题目我们需要使用的是快速幂的思路,然后因为最后数据很很大,使用题目也要求我们对最后的数据进行取模,所有我们最后用到的知识点还有模运算,所有这道题目总的知识考察是快速幂取模。
参考代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#include<list>
#include<stacK>
#include<queue>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
const ll mod=200907;
ll fastPow(ll a,ll n)//定义一个快速幂取模的函数,求a的n次方取模mod后的结果
{
ll base = a;
ll res = 1;
while(n)
{
if(n&1)//等同于如果n%2==1
res = (res * base) % mod;就用res单独乘一次base并且取模
base = (base * base) % mod;//每次base自乘并且取模
n >>= 1;//位运算,相当于n/2
}
return res;
}
int main()
{
ll t;
cin>>t;
while(t--)
{
ll a,b,c,k,ans,d;
cin >> a >> b >> c >> k;
if(a+c == 2 * b)
{
d=b-a;
ans=(a+(k-1)*d)%mod;//等差数列的通项公式
}
else
{
ans=(a*fastPow(b/a,k-1))%mod;//等比数列的通项公式
}
cout<<ans<<endl;
}
}