A sequence of numbers(HDU 2817 快速幂)

题目链接:

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;
    }
}

发布了55 篇原创文章 · 获赞 12 · 访问量 8955

猜你喜欢

转载自blog.csdn.net/qq_45740533/article/details/104106549