码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-06-04 15:52:59      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:

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

如果是等比 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
*/

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

标签:

原文地址:http://blog.csdn.net/u013451221/article/details/46360169

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!