矩阵快速幂

来源:互联网 发布:网络电视如何看直播 编辑:程序博客网 时间:2024/06/15 20:30

希望能够得出两个对应的一维矩阵.

/* Farewell. */#include <iostream>#include <vector>#include <cstdio>#include <string.h>#include <algorithm>#include <queue>#include <map>#include <string>#include <cmath>#include <bitset>#include <iomanip>#include <set>using namespace std;#define FFF freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#define gcd __gcd#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define MP make_pair#define MT make_tuple#define PB push_backtypedef long long  LL;typedef unsigned long long ULL;typedef pair<int,int > pii;typedef pair<LL,LL> pll;typedef pair<double,double > pdd;typedef pair<double,int > pdi;const int INF = 0x7fffffff;const LL INFF = 0x7f7f7f7fffffffff;const LL MOD = 2147493647;#define debug(x) std::cerr << #x << " = " << (x) << std::endlconst int MAXM = 5e3+17;const int MAXN = 1e3+17;struct matrix{    static const int MATRIX_N = 11;    LL a[MATRIX_N][MATRIX_N];    int row, col;    matrix():row(MATRIX_N),col(MATRIX_N){memset(a,0,sizeof(a));}    matrix(int x, int y):row(x),col(y){memset(a,0,sizeof(a));}    LL* operator [] (int x){return a[x];}    matrix operator * (matrix x){        matrix tmp(row, x.col);        for(int i = 0; i < row; i++)            for(int j = 0; j < col; j++) if(a[i][j])                for(int k = 0; k < x.col; k++) if (x[j][k]){                    tmp[i][k] = (tmp[i][k]+a[i][j] * x[j][k]%MOD)%MOD;                    tmp[i][k] %= MOD;                }        return tmp;    }    void operator *= (matrix x){*this = *this * x;}    matrix operator ^ (LL x){        matrix ret(row, col);        for (int i = 0; i < col; i++) ret[i][i] = 1;        matrix tmp = *this;        for (; x; x >>= 1, tmp *= tmp){if (x&1) ret *= tmp;}        return ret;    }    void print(){        for (int i = 0; i < row; i++){            for (int j = 0; j < col; j++) printf("%lld ",a[i][j]);            puts("");        }    }};int main(int argc, char const *argv[]){        #ifdef GoodbyeMonkeyKing        freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);    #endif    matrix rbq(7,7);    rbq.a[0][0] = rbq.a[0][2] = rbq.a[0][6] = 1;    rbq.a[0][1] = 2;    rbq.a[0][3] = rbq.a[0][5] = 4;    rbq.a[0][4] = 6;    rbq.a[1][0] = 1;    rbq.a[2][2] = rbq.a[2][6]= 1; rbq.a[2][3] = rbq.a[2][5] =4;    rbq.a[2][4] = 6;    rbq.a[3][3] = rbq.a[3][6] = 1;    rbq.a[3][4] = rbq.a[3][5] = 3;    rbq.a[4][4] = rbq.a[4][6] = 1; rbq.a[4][5] = 2;    rbq.a[5][5] = rbq.a[5][6] = 1; rbq.a[6][6] = 1;    int t;    cin>>t;    while(t--)    {        LL n,a,b;        cin>>n>>a>>b;        matrix fst(7,1);        fst.a[0][0] = b;        fst.a[1][0] = a;        fst.a[2][0] = 16;        fst.a[3][0] = 8;        fst.a[4][0] = 4;        fst.a[5][0] = 2;        fst.a[6][0] = 1;        matrix tis = rbq;        tis = tis^(n-2);        tis *= fst;        cout<<tis.a[0][0]%MOD<<endl;    }    return 0;   }
原创粉丝点击