矩阵加速

在这里插入图片描述

#include<iostream>
#define mod 1000000007
#define ll long long
using namespace std;

typedef struct
{
    ll a[3][3];
    void r()
    {
        for(int i=0;i<3;i++)
        a[i][i]=1;
    }
    void init()
    {
        for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
        a[i][j]=0;
    }
}matrix;

matrix operator *(const matrix x,const matrix y)
{
    matrix res;
    res.init();
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            for(int k=0;k<3;k++)
            res.a[i][j]=(res.a[i][j]+x.a[i][k]*y.a[k][j]%mod)%mod;
        }
    }
    return res;
}

matrix quickpow(matrix x,int n)
{
    matrix res;
    res.init();
    res.r();
    while(n>0)
    {
        if(n&1)
        {
            res=res*x;
        }
        x=x*x;
        n>>=1;
    }
    return res;
}

int main()
{
    matrix d;
    for(int i=0;i<3;i++) d.a[0][i]=1;
    matrix s;
    int s0[3][3]={{1,1,1},{0,1,1},{1,1,2}};
    for(int i=0;i<3;i++)
    for(int j=0;j<3;j++)
    {s.a[i][j]=s0[i][j];}
    ll t;
    cin>>t;
    ll q;
    ll p=0;
    ll *res=new ll[t];
    for(int i=0;i<t;i++)
    {
        cin>>q;
        q--;
        p=q%3;
        q/=3;     
        res[i]=((d*quickpow(s,q)).a[0][p])%mod;
    }
    for(int j=0;j<t;j++)
    cout<<res[j]<<endl;
    return 0;
}
posted @ 2022-06-06 20:35  lishangli  阅读(20)  评论(0)    收藏  举报