zoukankan      html  css  js  c++  java
  • 算法竞赛模板 矩阵快速幂

    设A为  的矩阵,B为  的矩阵,那么称  的矩阵C为矩阵A与B的乘积,记作  ,其中矩阵C中的第 行第 列元素可以表示为:

    如下所示:
     
    当矩阵A的列数等于矩阵B的行数时,A与B可以相乘
    (1) 矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
    (2) 乘积C的第 行第 列的元素等于矩阵A的第 行的元素与矩阵B的第 列对应元素乘积之和。
     

    矩阵快速幂的模板:

    就是要找到一个矩阵A,满足 F[i-1]*A=F[i]
    然后就通过矩阵的性质,计算出 F[n]=A^(n-1)*F[1]

    #define mod 10000
    #define N 2
    struct mat
    {
        int m[N+1][N+1];
        mat()
        {
            m[1][1]=1;m[1][2]=1;
            m[2][1]=1;m[2][2]=0;
        }
    };
    mat mul(mat a,mat b)
    {
        mat ans;
        int i,j,k;
        for(i=1;i<=N;i++)
            for(j=1;j<=N;j++)
                ans.m[i][j]=0;
        for(i=1;i<=N;i++)
            for(j=1;j<=N;j++)
                for(k=1;k<=N;k++)
                    ans.m[i][j]=(ans.m[i][j]+a.m[i][k]*b.m[k][j])%mod;
        return ans;
    }
    int matqp(int p)
    {
        mat ans,t;
        int i,j;
        for(i=1;i<=N;i++)
            for(j=1;j<=N;j++)
                if(i==j)ans.m[i][j]=1;
                else ans.m[i][j]=0;
        while(p)
        {
            if(p&1)
                ans=mul(ans,t);
            t=mul(t,t);
            p=p>>1;
        }
        return ans.m[2][1];//视公式而定 
    }
  • 相关阅读:
    图片《小美眉》
    redhat基本知识
    Linux 求助。设置分辨率?

    PHP close
    别想一个人承担一切
    java charAt返回char,不是int
    我的计算器
    支付宝面试小贴士
    java string charAt length()疑惑
  • 原文地址:https://www.cnblogs.com/kannyi/p/9518470.html
Copyright © 2011-2022 走看看