hdu 5950 Recursive sequence(递推 快速幂矩阵)

来源:互联网 发布:linux sort 0 编辑:程序博客网 时间:2024/05/17 06:51

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5950

参考自:http://blog.csdn.net/spring371327/article/details/52973534


#include<bits/stdc++.h>using namespace std;typedef long long int ll;const ll mod = 2147493647;//定义矩阵乘法struct matrix{    ll arr[7][7];    matrix operator*(matrix b){        matrix ans;        ll tmp;        for(int i=0; i<7; i++)        for(int j=0; j<7; j++){            ans.arr[i][j] = 0;            for(int k=0; k<7; k++){                tmp = (arr[i][k]*b.arr[k][j])%mod;                ans.arr[i][j] = (ans.arr[i][j] + tmp)%mod;            }        }        return ans;    }};//矩阵快速幂matrix quick_pow(matrix a,ll N){    matrix ans;    memset(ans.arr,0,sizeof(ans.arr));    for(int i=0; i<7; i++)        ans.arr[i][i] = 1;    while(N){        if(N&1)            ans = ans*a;        a = a*a;        N /= 2;;    }    return ans;}int main(){    matrix a;    memset(a.arr,0,sizeof(a.arr));    int tmp[7][7]={{0,1,0,0,0,0,0},                  {2,1,1,4,6,4,1},                  {0,0,1,4,6,4,1},                  {0,0,0,1,3,3,1},                  {0,0,0,0,1,2,1},                  {0,0,0,0,0,1,1},                  {0,0,0,0,0,0,1}};    for(int i=0;i<7;i++)for(int j=0;j<7;j++) a.arr[i][j]=tmp[i][j];    int T;    scanf("%d",&T);    ll N,aa,bb;    while(T--){        scanf("%lld%lld%lld",&N,&aa,&bb);        if(N==1)            printf("%lld\n",aa);        else if(N==2)            printf("%lld\n",bb);        else{            matrix ans = quick_pow(a,N-2);            ll ANS = 0;            ANS = (ANS+ans.arr[1][0]*aa)%mod;            ANS = (ANS+ans.arr[1][1]*bb)%mod;            ANS = (ANS+ans.arr[1][2]*16)%mod;            ANS = (ANS+ans.arr[1][3]*8)%mod;            ANS = (ANS+ans.arr[1][4]*4)%mod;            ANS = (ANS+ans.arr[1][5]*2)%mod;            ANS = (ANS+ans.arr[1][6]*1)%mod;            printf("%lld\n",ANS);        }    }    return 0;}


阅读全文
0 0
原创粉丝点击