题意:求S = A + A2 + A3 + … + Ak.(mod m)

这道题很明显可以用矩阵乘法,但是这道题的矩阵是分块矩阵,

  分块矩阵概念如下:当一个矩阵A中的单位元素aij不是一个数值而是一个矩阵是A矩阵称为分块矩阵,在性质满足的前提下依然满足矩阵加法乘法。 例如矩阵乘法A×B,将B按行分块,可以看成矩阵A乘列向量,其中B中每个元素是一个行向量;将A按列分块同理。

  简单地说,就是矩阵里的元素还是个矩阵。这道题我们可以像这样构建矩阵:

        ∵Sn=Sn-1+Ak   有如下转移图

           

        写出邻接矩阵 (下图用E表示单位矩阵 也就是"1”,0表示全是0的矩阵 也就是“0”,A即为输入的矩阵)

        

        也就有:

                

        最终答案是:

          

所以,最终C++程序只需要重载运算符就可以轻松AC了

而另一种做法,也就是二分加矩阵快速幂则需要较长时间(800+MS)

 #include <iostream>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <cstring>
#include <cstdio>
#include <cstdlib> using namespace std; int n,k,m; class Matrix
{
public:
int val[][];
int x,y; Matrix()
{
memset(val,,sizeof(val));
x=y=;
return ;
} void set_E()
{
int i;
for(i=;i<=x;++i)
val[i][i]=;
return ;
} Matrix operator*(Matrix b)
{
int i,j,k;
Matrix c;
c.resize(x,b.y); for(k=;k<=b.x;++k)
for(i=;i<=x;++i)
if(val[i][k])//不加这行就要340+MS
for(j=;j<=b.y;++j)
c.val[i][j]=(c.val[i][j]+val[i][k]*b.val[k][j])%m;
return c;
} Matrix operator+(Matrix b)
{
Matrix c;
c.resize(max(x,b.x),max(y,b.y));
int i,j; for(i=;i<=c.x;++i)
for(j=;j<=c.y;++j)
c.val[i][j]=(val[i][j]+b.val[i][j])%m; return c;
} void resize(const int & _x,const int & _y)
{
x=_x,y=_y;
return ;
}
}A; class Matrix_Plus
{
public:
Matrix val[][];
int x,y; Matrix_Plus()
{
memset(val,,sizeof(val));
x=y=;
return ;
} void set_E()
{
int i;
for(i=;i<=x;++i)
val[i][i].set_E();
return ;
} Matrix_Plus operator*(Matrix_Plus b)
{
Matrix_Plus c;
int i,j,k;
c.resize(x,b.y); for(k=;k<=b.x;++k)
for(i=;i<=x;++i)
for(j=;j<=b.y;++j)
c.val[i][j]=c.val[i][j]+val[i][k]*b.val[k][j];
return c;
} Matrix_Plus operator^(int p)
{
Matrix_Plus r,base;
r.resize(,);
r.val[][].resize(n,n);
r.val[][].resize(n,n);
r.val[][].resize(n,n);
r.val[][].resize(n,n);
r.set_E();
base=*this; while(p)
{
if(p&)
r=r*base;
base=base*base;
p>>=;
} return r;
} void resize(const int & _x,const int & _y)
{
x=_x,y=_y;
return ;
} }S,A_; int main()
{
int i,j; scanf("%d%d%d",&n,&k,&m);
A.resize(n,n); for(i=;i<=n;++i)
{
for(j=;j<=n;++j)
{
scanf("%d",&A.val[i][j]);
}
} S.resize(,);
S.val[][]=A;
S.val[][].resize(n,n);
S.val[][].resize(n,n); A_.resize(,);
A_.val[][].resize(n,n);
A_.val[][].resize(n,n);
A_.val[][].resize(n,n);
A_.val[][].resize(n,n);
A_.val[][].set_E();
A_.val[][].set_E();
A_.val[][]=A;
S=S*(A_^k); for(i=;i<=n;++i)
{
for(j=;j<=n;++j)
printf("%d ",S.val[][].val[i][j]);
printf("\n");
}
return ;
}

poj3233 题解 矩阵乘法 矩阵快速幂的更多相关文章

  1. Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)

    Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...

  2. Luogu T7152 细胞(递推,矩阵乘法,快速幂)

    Luogu T7152 细胞(递推,矩阵乘法,快速幂) Description 小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并 观察细胞分裂的规律. 他选取了一种特别的细胞,每 ...

  3. HDU4965 Fast Matrix Calculation —— 矩阵乘法、快速幂

    题目链接:https://vjudge.net/problem/HDU-4965 Fast Matrix Calculation Time Limit: 2000/1000 MS (Java/Othe ...

  4. bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] ...

  5. poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)

    Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7825   Accepted: 3068 Descri ...

  6. BZOJ_1009_[HNOI2008]_GT考试_(动态规划+kmp+矩阵乘法优化+快速幂)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1009 字符串全部由0~9组成,给出一个串s,求一个长度为n的串,不包含s的种类有多少. 分析 ...

  7. bzoj 3240 矩阵乘法+十进制快速幂

    首先,构造出从f[][i]->f[][i+1]的转移矩阵a,和从f[i][m]->f[i+1][1]的转移矩阵b, 那么从f[1][1]转移到f[n][m]就是init*(a^(m-1)* ...

  8. 【HDOJ5950】Recursive sequence(矩阵乘法,快速幂)

    题意:f[1]=a,f[2]=b,f[i]=2f[i-2]+f[i-1]+i^4(i>=3),多组询问求f[n]对2147493647取模 N,a,b < 2^31 思路:重点在于i^4的 ...

  9. 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)

    先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...

随机推荐

  1. JSP-Runoob:JSP 动做元素

    ylbtech-JSP-Runoob:JSP 动做元素 1.返回顶部 1. JSP 动作元素 与JSP指令元素不同的是,JSP动作元素在请求处理阶段起作用.JSP动作元素是用XML语法写成的. 利用J ...

  2. atcoder 076

    日本人的比赛 C:如果两个数差了大于1无解,否则分类讨论 #include<bits/stdc++.h> using namespace std; typedef long long ll ...

  3. SmartDispatcher 类

    UI线程中使用 public class SmartDispatcher { public static void BeginInvoke(Action action) { if (Deploymen ...

  4. jquery中对于为一组标签赋予点击事件

    可以用each,但是each不能对动态的元素进行事件的绑定, 不过,其实也很简单,只需要获取所有的标签集,然后用动态绑定的方法,比如live进行绑定就可以了. 有时候,其实不难,只是自己想的太过复杂. ...

  5. 【转】关于Java基础你不得不会的34个问题

    1. 面向对象和面向过程的区别 面向过程 优点: 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机.嵌入式开发.Linux/Unix等一般采用面向过程开发,性能是最重要的 ...

  6. ResGen.exe”已退出,代码为2 问题处理

    转载自  http://blog.sina.com.cn/s/blog_5f82a1060101d8tm.html 在64位的Windows 7下,用VS2010编译4.0以前的.Net项目会有问题. ...

  7. Laravel5.1学习笔记15 数据库1 数据库使用入门

    简介 运行原生SQL查询  监听查询事件 数据库事务 使用多数据库连接 简介 Laravel makes connecting with databases and running queries e ...

  8. python框架之虚拟环境的配置

    在开发过程中,往往同一台电脑要开发不同的项目,不同的项目可能需要不同版本的包,为了解决这个问题就引出了虚拟环境. 配置虚拟环境: 1.安装虚拟环境: sudo pip3 install virtual ...

  9. Element type "LinearLayout" must be followed by either attribute specifications, ">" or "/>"的解决办法

    看老师的word文档开始学习.复制了一段代码,在layout中新建了一个Android XML file,发现有提示错误. 代码如下: <?xml version="1.0" ...

  10. mysql下载和安装Windows服务

    一.下载mysql:https://dev.mysql.com/downloads/mysql/,解压拷贝到D:\software\mysql-8.0.13-winx64 二.在D:\software ...