【HDU】2817-A sequence of numbers(高速幂)

【HDU】2817-A sequence of numbers(快速幂)

对于两种序列一种等比,一种等差

如果是等比 ak = a1 + (k - 1) * d 直接用((a1 * mod) + ((k - 1) % mod) * (d % mod)) % mod求就可以了

如果是等差 ak = a1 * q ^(k - 1) 利用快速幂求出q ^(k - 1)可以得到结果

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
int n;
int k;
LL a[5];
LL mod = 200907;
LL pow_mod(LL a,int m){
    //printf("%d\n",m);
    if(m == 1)
        return a % mod;
    if(m == 0)
        return 1;
    LL   d = pow_mod(a,m / 2);
    LL ans = d * d % mod;
    if(m & 1)
        ans = ans * a % mod;
    return ans;
}
int main(){
    scanf("%d",&n);
    while(n--){
        for(int i = 0; i < 3; i++)
            scanf("%I64d",&a[i]);
        scanf("%d",&k);
        LL ans;
        if(a[1] - a[0] == a[2] - a[1]){
            ans = ((a[0] % mod) + ((k - 1) % mod) * ((a[1] - a[0]) % mod)) % mod;
            printf("%I64d\n",ans);
        }
        else{
            LL d = a[1] / a[0];
            ans = ((a[0] % mod) * pow_mod(d,k - 1)) % mod;
            printf("%I64d\n",ans);
        }
    }
    return 0;
}
/*
1
1 10 100 1000000000
*/