zoukankan      html  css  js  c++  java
  • oj.Matrix Power Series 1003矩阵乘法+快速取幂

    #include"stdio.h"
    #include"iostream"
    #include"algorithm"
    #include"map"
    using namespace std;
    int n,k,M;
    struct Matrix
    {
        void init()
        {
           memset(m,0,sizeof(m));
        }      
        Matrix  operator *(Matrix t)
        {
            Matrix t1;
            t1.init();
            for(int i=0;i<n;++i)
              for(int j=0;j<n;++j)
              {   for(int k=0;k<n;++k)
                   t1.m[i][j]+=m[i][k]*t.m[k][j];
                  t1.m[i][j]%=M;       
              }  
            return t1;
         }
        Matrix  operator+(Matrix t)
        {
            for(int i=0;i<n;++i)
              for(int j=0;j<n;++j)
                t.m[i][j]=(t.m[i][j]+m[i][j])%M;
              return t;       
        }
        void print()
        {
            for(int i=0;i<n;++i)
            {
               for(int j=0;j<n;++j)
                  printf(j==0?"%d":" %d",m[i][j]);
                  puts("");       
            }    
        }
        int m[35][35];
    };
    map<  int ,Matrix > mp,mp1;
    Matrix  ma,s;
    inline  Matrix mu1(Matrix ma,int k)
    {
        if(mp.count(k))
           return mp[k];
         if(k==1)
            return ma;
         Matrix s=mu1(ma,k/2),tk=s*s;
         if(k&1)
            mp[k]=tk*ma;
         else
             mp[k]=tk;
         return mp[k];          
    }
    inline  Matrix add(Matrix  ma,int k)
    {
        if(mp1.count(k))
           return mp1[k];
        if(k==1)
           return ma;
          Matrix  t=add(ma,k/2),t1=t+mu1(ma,k/2)*t;
        if(k&1)
           mp1[k]=t1+mu1(ma,k);
        else
           mp1[k]=t1;
        return mp1[k];       
    }
    int main()
    {
        while(scanf("%d%d%d",&n,&k,&M)!=EOF)
        {
            mp.clear();
            mp1.clear();
            ma.init();s.init();
            for(int i=0;i<n;++i)
              for(int j=0;j<n;++j)
                scanf("%d",&ma.m[i][j]),ma.m[i][j]%=M;
             s=add(ma,k);
             s.print( );                                   
        }   
        return 0;
    }

  • 相关阅读:
    GitHub入门教程
    转:使用ActiveX插件时object显示问题,div被object标签遮挡的解决方案
    windows集成资料
    转:获取windows凭证管理器明文密码
    转: OVER() 系列函数介绍
    SQL Prompt 快捷键
    转:敏捷开发之Scrum扫盲篇
    转:修改IIS虚拟目录名称bat脚本
    转:EditPuls 5.0 注册码
    转:RowVersion 用法
  • 原文地址:https://www.cnblogs.com/QQbai/p/2132034.html
Copyright © 2011-2022 走看看