• 矩阵快速幂


    //https://nanti.jisuanke.com/t/A2022
    #include <bits/stdc++.h>
    //#define endl '
    '
    #define lose {printf("NO
    ");return;}
    #define win {printf("YES
    ");return;}
    #define all(A) (A).begin(),(A).end()
    #define FOR(I, A, B) for (int I = (A); I <= (B); ++I)
    #define PER(I, A, B) for (int I = (A); I >= (B); --I)
    #define DB(A) cout<<(A)<<endl 
    #define lson k*2
    #define rson k*2+1
    #define fi first
    #define se second
    #define PB push_back
    #define Pair pair<int,int>
    #define MP make_pair
    #define LL long long
    #define ull unsigned long long
    #define int LL
    using namespace std;
    #define DB1(args...) do { cout << #args << " : "; dbg(args); } while (0)
    void dbg() { std::cout << "  #
    "; }
    template<typename T, typename...Args>
    void dbg(T a, Args...args) { std::cout << a << ' '; dbg(args...); }
    //var
    const int maxn=2e5+10;
    const int MAX=1000;
    const int inf=0x3f3f3f3f;   
    const int mod=1e9+7;
    //head
    
    
    #define NUM 9  
    int MAXN=NUM;  
    struct Matrix 
    {  
        int a[NUM][NUM];  
        void init()           
        {  
            memset(a,0,sizeof(a));  
            for(int i=0;i<MAXN;i++)  
                a[i][i]=1;  
        }  
    } A;  
    Matrix mul(Matrix a,Matrix b)  //(a*b)%mod  矩阵乘法  
    {  
        Matrix ans;  
        for(int i=0;i<MAXN;i++)  
            for(int j=0;j<MAXN;j++)  
            {  
                ans.a[i][j]=0;  
                for(int k=0;k<MAXN;k++)  
                    ans.a[i][j]+=a.a[i][k]*b.a[k][j];  
                ans.a[i][j]%=mod;  
            }  
        return ans;  
    }  
    
    Matrix add(Matrix a,Matrix b)  //(a+b)%mod  //矩阵加法  
    {  
        int i,j,k;  
        Matrix ans;  
        for(i=0;i<MAXN;i++)  
            for(j=0;j<MAXN;j++)  
            {  
                ans.a[i][j]=a.a[i][j]+b.a[i][j];  
                ans.a[i][j]%=mod;  
            }  
        return ans;  
    }  
    
    Matrix pow(Matrix a,int n)    //(a^n)%mod  //矩阵快速幂  
    {  
        Matrix ans;  
        ans.init();  
        while(n)  
        {  
            if(n%2)//n&1  
                ans=mul(ans,a);  
            n/=2;  
            a=mul(a,a);  
        }  
        return ans;  
    }  
    
    Matrix sum(Matrix a,int n)  //(a+a^2+a^3....+a^n)%mod// 矩阵的幂和  
    {  
        int m;  
        Matrix ans,pre;  
        if(n==1)  
            return a;  
        m=n/2;  
        pre=sum(a,m);                      //[1,n/2]  
        ans=add(pre,mul(pre,pow(a,m)));   //ans=[1,n/2]+a^(n/2)*[1,n/2]  
        if(n&1)  
            ans=add(ans,pow(a,n));          //ans=ans+a^n  
        return ans;  
    }  
    
    void output(Matrix a)//输出矩阵  
    {  
        for(int i=0;i<MAXN;i++)  
            for(int j=0;j<MAXN;j++)  
                printf("%lld%c",a.a[i][j],j==MAXN-1?'
    ':' ');  
    }  
    
    
    int n,m;
    void solve()
    {
    	cin>>n;
    	if(n == 1)  printf("3
    ");
            else if(n == 2) printf("9
    ");
            
            
        else
        {
        	Matrix res,ans = {
                0,0,0, 1,0,0, 1,0,0,
                1,0,0, 0,0,0, 1,0,0,
                1,0,0, 1,0,0, 1,0,0,
    
                0,1,0, 0,1,0, 0,0,0,
                0,1,0, 0,0,0, 0,1,0,
                0,0,0, 0,1,0, 0,1,0,
    
                0,0,1, 0,0,1, 0,0,1,
                0,0,1, 0,0,0, 0,0,1,
                0,0,1, 0,0,1, 0,0,0
            }; 
            //DB1(ans.a[3][2]);
            //output(ans);
            //return;
    	    int ant=0;
    	    res=pow(ans,n-2);
    	    //output(res);
    	    for(int i = 0;i < MAXN;i++)
    	                for(int j = 0;j < MAXN;j++)
    	                    ant = (ant + res.a[i][j]) % mod;
    	   printf("%lld
    ",ant);
        }
    	
    
    } 
    signed main()
    {
        // freopen("read.txt", "r", stdin);
        // freopen("ans.txt", "w", stdout);
        int TestCase = 1;
        cin>>TestCase;
        while (TestCase--)
        {
            solve();
        }
        char EndFile = getchar();
        EndFile = getchar();
        return 0;
    }
    
    
  • 相关阅读:
    hdu--1026--Ignatius and the Princess I(bfs搜索+dfs(打印路径))
    hdu--1798--Doing Homework again(贪心)
    开启事务的两种方法
    事务的隔离级别,乐观锁,悲观锁
    树的结构,无限极关联
    微信小程序的加密解密以及小程序的支付
    微信小程序之登录连接django,以及用户的信息授权认证
    微信小程序三
    微信小程序二
    vue-cookies缓存
  • 原文地址:https://www.cnblogs.com/reshuffle/p/13745657.html
Copyright © 2020-2023  润新知