快速幂等差数列

快速幂等差数列

\(a_i+a_{i+2}=a_{i+1}*2\)为等差数列,根据通项\(a_n=a_1+(n-1)*d\)就可以求出第n项。
而对于等比数列,\(a_n=a_1*q^{n-1}\),q的n-1次幂。

#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const ll M = 200907;
ll pow(ll x, ll y)//快速幂 
{
    ll ans_ = 1;
    while(y)
    {
        if(y%2==1) ans_*=x;
        x = (x*x)%M;
        y = y/2;
    }
    return ans_;
} 
ll a, b, c, d, k, ans;
void s()
{
    scanf("%lld%lld%lld%lld", &a, &b, &c, &k);
    if(c-b == b-a)
    {
        d = (b-a)%M;
        ans = (a+(k-1)%M*d)%M;
    }//判断是否为等差数列 
    else
    {
        d = (b/a)%M;
        ans = a%M*pow(d, k-1)%M;
    }//否则为等比数列 
    printf("%lld\n", ans);
}
int t;
int main()
{
    scanf("%d", &t);
    while(t--) s();
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/orange-233/p/12093374.html