zoukankan      html  css  js  c++  java
  • 广工十四届校赛 count 矩阵快速幂

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6470

    题意:求,直接矩阵快速幂得f(n)即可

    构造矩阵如下:

    n^3是肯定得变换的,用二项式展开来一点点配吧

    我们会发现中间6*6的矩阵是个常数矩阵,则可以化为A=B^(N-2)*C(n-2次幂是因为我们求解是从N=3开始的),根据矩阵快速幂算出B^(N-2)次幂即可以了

    矩阵快速幂的时间复杂度是logn

    注意:我们中间构造的矩阵必须是一个方阵,矩阵快速幂的难点就在于构建中间的方阵

    比如矩阵A,B,C,B是系数矩阵的话,A里的n要比c里的大1,并不是直接表示出来就可以了,左右两边的矩阵如果右边是X(n-1),左边就是Xn

    方阵构建技巧可以看这篇博文:https://blog.csdn.net/u012061345/article/details/52224623

    代码如下:

     
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int mod=123456789;
     
    struct matrix{
        ll a[11][11]; //begin with 1
        int r,c;
        matrix(int n,int m):r(n),c(m){memset(a,0,sizeof(a));}
        ll* operator[](int x){return a[x];}
        friend matrix operator*(matrix A,matrix B)
        {
            matrix C(A.r,B.c);
            for(int i=1;i<=A.r;i++)
                for(int j=1;j<=B.c;j++)
                    for(int k=1;k<=A.c;k++){
                        C[i][j]+=(A[i][k]*B[k][j])%mod;
                        C[i][j]+=mod;
                        C[i][j]%=mod;
                    }
            return C;
        }
    };
    matrix qpow(matrix A,ll m)//方阵A的m次幂
    {
        matrix ans(A.r,A.c);
        for(int i=1;i<=A.r;i++) ans.a[i][i]=1; //单位矩阵
        while(m)
        {
            if(m&1)ans=ans*A;
            A=A*A;
            m>>=1;
        }
        return ans;
    }
     
    int main()
    {
        ll T,n;
        for(cin>>T;T--;)
        {
            scanf("%lld",&n);
            matrix A(6,6);
            A[1][1]=1;
            A[1][2]=2;
            A[1][3]=1;
            A[1][4]=3;
            A[1][5]=3;
            A[1][6]=1;
            A[2][1]=1;
            A[3][3]=1;
            A[4][3]=1;
            A[4][4]=1;
            A[5][3]=1;
            A[5][4]=2;
            A[5][5]=1;
            A[6][3]=1;
            A[6][4]=3;
            A[6][5]=3;
            A[6][6]=1;
            matrix X2(6,1);
            X2[1][1]=2;
            X2[2][1]=1;
            X2[3][1]=1;
            X2[4][1]=2;
            X2[5][1]=4;
            X2[6][1]=8;
     
            matrix Xn=qpow(A,n-2)*X2;
            printf("%lld
    ",Xn[1][1]);
        }
    }
  • 相关阅读:
    session监听
    Ubuntu上安装MongoDB(转)
    JAVA中的集合(转)
    Iterator的用法(转)
    PHPExcel常用方法汇总(转)
    MongoDB的安装及在PHP中的配置Windows版
    [转载]使用FastReport 3.0及以上版本创建动态报表的几个技巧
    FastReport
    ZeosLib
    [转载]FastReport问题整理
  • 原文地址:https://www.cnblogs.com/qingjiuling/p/10557768.html
Copyright © 2011-2022 走看看