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

来源:互联网 发布:mac php环境配置 编辑:程序博客网 时间:2024/06/07 15:29

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

如果是等比 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;}/*11 10 100 1000000000*/

0 0