zoukankan      html  css  js  c++  java
  • 矩阵乘法以及矩阵快速幂

     最近遇到很多有限状态机的递推计数问题,构造矩阵进行快速幂是很直观的方法。总结个模板吧。

    矩阵定义:

    struct mx
    {
        LL n,m;
        LL c[20][20];//需要根据题目开大
        void initMath(LL _n)//初始化方阵
        {
            m=n=_n;
        }
        void initOne(LL _n)//初始化单位矩阵
        {
            m=n=_n;
            for(LL i=0;i<n;i++)
                for(LL j=0;j<m;j++)
                    c[i][j]=(i==j);
        }
        void print()//测试打印
        {
            for(LL i=0;i<n;i++)
            {
                for(LL j=0;j<m;j++)
                   cout<<c[i][j]<<' ';
                cout<<endl;
            }
        }
    };

    乘法:

    mx Mut(mx a,mx b)
    {
        mx c;
        c.n=a.n,c.m=b.m;
        for(LL i=0;i<a.n;i++)
            for(LL j=0;j<b.m;j++)
            {
                LL sum=0;
                for(LL k=0;k<b.n;k++)
                    sum+=a.c[i][k]*b.c[k][j],sum%=mod;
                c.c[i][j]=sum;
            }
        return c;
    }

    快速幂:

    mx fastMi(mx a,LL b)
    {
        mx mut;mut.initOne(a.n);
        while(b)
        {
            if(b%2!=0)
                mut=Mut(mut,a);
            a=Mut(a,a);
            b/=2;
        }
        return mut;
    }
  • 相关阅读:
    新生题目集
    C语言课程设计
    Java学习-8
    Java学习-7
    Java学习-6
    Java学习-5
    HTML学习
    Java学习-4
    强大的项目管理工具maven
    java学习-3
  • 原文地址:https://www.cnblogs.com/LukeStepByStep/p/7151537.html
Copyright © 2011-2022 走看看