题意:

       给一个n*n的矩阵A,然后求S=A + A^2 + A^3 + ..+ A^k.

思路:

      矩阵快速幂,这个题目挺新颖的,以往的矩阵快速幂都是退出公式,然后构造矩阵,这个比较特别,直接上子矩阵吧

A 1   平方后得到 A^2 1+A  三次方   A^3   1+A+A^2

0 1               0   1             0     1       ...这样就行了,

还有注意这个是矩阵套矩阵,然后就是快速幂了,比较容易实现,有一点要注意,

大矩阵的单位矩阵只有对角线才是单位小矩阵,还有一个地方,就是最后我们要在大矩阵的1 2 位置减去单位矩阵,这个减去单位矩阵后如果比0小怎么办,我的处理方法是比0小就再加上余数。


#include<stdio.h>
#include<string.h> typedef struct
{
int mat[32][32];
}M; typedef struct
{
M MAT[3][3];
}MM; int n ,MOD; M matM(M a ,M b)
{
M c;
memset(c.mat ,0 ,sizeof(c.mat)); for(int k = 1 ;k <= n ;k ++)
for(int i = 1 ;i <= n ;i ++)
if(a.mat[i][k])
for(int j = 1 ;j <= n ;j ++)
c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD;
return c;
} M addM(M a ,M b)
{
M c;
memset(c.mat ,0 ,sizeof(c.mat));
for(int i = 1 ;i <= n ;i ++)
for(int j = 1 ;j <= n ;j ++)
c.mat[i][j] = (a.mat[i][j] + b.mat[i][j]) % MOD;
return c;
} MM matMM(MM a ,MM b)
{
MM c;
for(int i = 1 ;i <= 2 ;i ++)
for(int j = 1 ;j <= 2 ;j ++)
for(int k = 1 ;k <= n ;k ++)
for(int l = 1 ;l <= n ;l ++)
c.MAT[i][j].mat[k][l] = 0; for(int i = 1 ;i <= 2 ;i ++)
for(int j = 1 ;j <= 2 ;j ++)
for(int k = 1 ;k <= 2 ;k ++)
c.MAT[i][j] = addM(c.MAT[i][j] ,matM(a.MAT[i][k] ,b.MAT[k][j])); return c;
} MM quickMM(MM a ,int b)
{
MM c;
for(int i = 1 ;i <= 2 ;i ++)
for(int j = 1 ;j <= 2 ;j ++)
for(int k = 1 ;k <= n ;k ++)
for(int l = 1 ;l <= n ;l ++)
c.MAT[i][j].mat[k][l] = 0; for(int k = 1 ;k <= n ;k ++)
c.MAT[1][1].mat[k][k] = c.MAT[2][2].mat[k][k] = 1; while(b)
{
if(b & 1) c = matMM(c ,a);
a = matMM(a ,a);
b >>= 1;
}
return c;
} int main ()
{
int i ,j ,b;
MM A;
while(~scanf("%d %d %d" ,&n ,&b ,&MOD))
{
//MOD = 10000000;
for(i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= n ;j ++)
{
scanf("%d" ,&A.MAT[1][1].mat[i][j]);
A.MAT[2][1].mat[i][j] = 0;
if(i == j)
A.MAT[1][2].mat[i][j] = A.MAT[2][2].mat[i][j] = 1;
else A.MAT[1][2].mat[i][j] = A.MAT[2][2].mat[i][j] = 0;
} MM ans = quickMM(A ,b + 1); for(int i = 1 ;i <= n ;i ++)
for(int j = 1 ;j <= n ;j ++)
{
if(i == j) ans.MAT[1][2].mat[i][j] --; if(ans.MAT[1][2].mat[i][j] < 0) ans.MAT[1][2].mat[i][j] += MOD; if(j == n) printf("%d\n",ans.MAT[1][2].mat[i][j]);
else printf("%d " ,ans.MAT[1][2].mat[i][j]);
}
}
return 0; }

POJ3233不错的矩阵(矩阵套矩阵)的更多相关文章

  1. 经典矩阵快速幂之一-----poj3233(矩阵套矩阵

    题意:给你一个矩阵A,求S=A+A^2+A^3+...+A^k. 其实这个当时我看着毫无头绪,看了他们给的矩阵发现好!精!妙! 我们这样看 是不是有点思路! 没错!就是右上角,我们以此类推可以得到A+ ...

  2. C++题解:Matrix Power Series ——矩阵套矩阵的矩阵加速

    Matrix Power Series r时间限制: 1 Sec 内存限制: 512 MB 题目描述 给定矩阵A,求矩阵S=A^1+A^2+--+A^k,输出矩阵,S矩阵中每个元都要模m. 数据范围: ...

  3. POJ - 3233 矩阵套矩阵

    题意:给你矩阵\(A\),求\(S=\sum_{i=1}^{k}A^i\) 构造矩阵 \[ \begin{bmatrix} A & E \\ 0 & E\\ \end{bmatrix} ...

  4. 二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185

    Milking Grid Problem's Link:http://poj.org/problem?id=2185 Mean: 给你一个n*m的字符矩阵,让你求这个字符矩阵的最小覆盖矩阵,输出这个最 ...

  5. <矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置>

    //矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置 #include<stdio.h> #include<stdlib.h> #define M 2 #define N 3 #d ...

  6. Codevs 1287 矩阵乘法&&Noi.cn 09:矩阵乘法(矩阵乘法练手题)

    1287 矩阵乘法  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 小明最近在为线性代数而头疼, ...

  7. Matlab中矩阵的平方和矩阵中每个元素的平方介绍

    该文章讲述了Matlab中矩阵的平方和矩阵中每个元素的平方介绍.   设t = [2 4 2 4] 则>> t.^2 ans = 4 164 16 而>> t^2 ans = ...

  8. C语言经典算法 - 多维矩阵转一维矩阵的代码

    下边内容内容是关于C语言经典算法 - 多维矩阵转一维矩阵的内容,应该能对码农也有好处. #include <stdio.h>#include <stdlib.h>int mai ...

  9. Jacobian矩阵、Hessian矩阵和Newton's method

    在寻找极大极小值的过程中,有一个经典的算法叫做Newton's method,在学习Newton's method的过程中,会引入两个矩阵,使得理解的难度增大,下面就对这个问题进行描述. 1, Jac ...

随机推荐

  1. CentOS 7关闭firewalld启用iptables 开放端口

    在CentOS7中,有很多CentOS 6中的常用服务发生了变化. 其中iptables是其中比较大的一个.防火墙iptables被firewalld取代. 本文将介绍,如果采用systemctl关闭 ...

  2. Linux速通 大纲

    1.Linux操作系统安装及初始化配置(熟悉) 2.Linux操作系统目录组成结构及文件级增删改查操作(重点) 3.Linux操作系统用户.权限管理(重点) 4.开源软件及Linux下软件包的管理(重 ...

  3. Linux速通07 硬盘分区、格式化及文件系统管理

    硬件设备与文件名的对应关系 # 在Linux系统中,每个设备都被当作一个文件来对待 # 各种设备在Linux中的文件名 设备 设备在Linux内的文件名 IDE硬盘 /dev/hd[a-d] SCSI ...

  4. Cloudam云端,探索高性能计算在药物研究领域的解决方案

    近日,Cloudam云端与国内某知名药企与合作,通过接入Cloudam云端自主研发的云E云超算服务,计算效率提高的数百倍.这也是云算力在生命科学领域的又一次成功应用.Cloudam云端云E云超算服务是 ...

  5. MySQL入门(5)——运算符

    MySQL入门(5)--运算符 算术运算符 MySQL支持的算数运算符包括加.减.乘.除.求余. 符号 作用 + 加法运算 - 减法运算 * 乘法运算 / 除法运算 % 求余运算 DIV 除法运算,返 ...

  6. 2019 GDUT Rating Contest I : Problem C. Mooyo Mooyo

    题面: C. Mooyo Mooyo Input file: standard input Output file: standard output Time limit: 1 second Memory ...

  7. VS2013环境下配置OSG(3.4.0版本)

    参考链接1: http://blog.csdn.net/lonsegdi/article/details/50579439 参考链接2: http://bbs.osgchina.org/forum.p ...

  8. 攻防世界 reverse tt3441810

    tt3441810 tinyctf-2014 附件给了一堆数据,将十六进制数据部分提取出来, flag应该隐藏在里面,(这算啥子re,) 保留可显示字符,然后去除填充字符(找规律 0.0) 处理脚本: ...

  9. juc下Condition类解析

    在使用Lock之前,我们使用的最多的同步方式应该是synchronized关键字来实现同步方式了.配合Object的wait().notify()系列方法可以实现等待/通知模式. Condition接 ...

  10. springboot+druid报错log4j:WARN No appenders could be found for logger (druid.sql.Connection). log4j:WARN Please initialize the log4j system properly.

     解决方案:新建文件log4j.properties log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.Con ...