POJ3233不错的矩阵(矩阵套矩阵)
题意:
给一个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不错的矩阵(矩阵套矩阵)的更多相关文章
- 经典矩阵快速幂之一-----poj3233(矩阵套矩阵
题意:给你一个矩阵A,求S=A+A^2+A^3+...+A^k. 其实这个当时我看着毫无头绪,看了他们给的矩阵发现好!精!妙! 我们这样看 是不是有点思路! 没错!就是右上角,我们以此类推可以得到A+ ...
- C++题解:Matrix Power Series ——矩阵套矩阵的矩阵加速
Matrix Power Series r时间限制: 1 Sec 内存限制: 512 MB 题目描述 给定矩阵A,求矩阵S=A^1+A^2+--+A^k,输出矩阵,S矩阵中每个元都要模m. 数据范围: ...
- POJ - 3233 矩阵套矩阵
题意:给你矩阵\(A\),求\(S=\sum_{i=1}^{k}A^i\) 构造矩阵 \[ \begin{bmatrix} A & E \\ 0 & E\\ \end{bmatrix} ...
- 二维KMP - 求字符矩阵的最小覆盖矩阵 - poj 2185
Milking Grid Problem's Link:http://poj.org/problem?id=2185 Mean: 给你一个n*m的字符矩阵,让你求这个字符矩阵的最小覆盖矩阵,输出这个最 ...
- <矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置>
//矩阵的基本操作:矩阵相加,矩阵相乘,矩阵转置 #include<stdio.h> #include<stdlib.h> #define M 2 #define N 3 #d ...
- Codevs 1287 矩阵乘法&&Noi.cn 09:矩阵乘法(矩阵乘法练手题)
1287 矩阵乘法 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 小明最近在为线性代数而头疼, ...
- Matlab中矩阵的平方和矩阵中每个元素的平方介绍
该文章讲述了Matlab中矩阵的平方和矩阵中每个元素的平方介绍. 设t = [2 4 2 4] 则>> t.^2 ans = 4 164 16 而>> t^2 ans = ...
- C语言经典算法 - 多维矩阵转一维矩阵的代码
下边内容内容是关于C语言经典算法 - 多维矩阵转一维矩阵的内容,应该能对码农也有好处. #include <stdio.h>#include <stdlib.h>int mai ...
- Jacobian矩阵、Hessian矩阵和Newton's method
在寻找极大极小值的过程中,有一个经典的算法叫做Newton's method,在学习Newton's method的过程中,会引入两个矩阵,使得理解的难度增大,下面就对这个问题进行描述. 1, Jac ...
随机推荐
- C# 基础 - linq 举例应用
public class Player { public string Id { get; set; } public string Name { get; set; } public int Age ...
- dfs求连通块
递归 递归是什么?绝大部分人都会说:自己调用自己,刚开始我也是这样理解递归的.确实没错,递归的确是自己调用自己.递归简单的应用:编写一个能计算斐波那契数列的函数,也就是这样: int fb(int n ...
- 《Selenium自动化测试实战:基于Python》Selenium自动化测试框架入门
第1章 Selenium自动化测试框架入门 1.1 Selenium自动化测试框架概述 说到目前流行的自动化测试工具,相信只要做过软件测试相关工作,就一定听说过Selenium. 图1-1是某企业 ...
- python课程设计--学生管理系统
系统要求 1.添加学生 2.删除学生 3.修改学生信息 4.查询学生 5.查看所有学生信息 6.学生信息数据的存储与读取 源码:student.py #coding:utf-8 2 #定义学员类 3 ...
- Anchor-Free总结
目录 Anchor-Free综述 一. CornerNet 1.1 概述 1.2 模块介绍 1.2.1 Heatmap 1.2.2 Offset 1.2.3 Grouping Corners 1.2. ...
- 01-静态web服务器(Python)-面向对象的对比
普通写法,静态web服务器: 先创建TCP服务器套接字,然后等待客户端(这里是浏览器)请求连接. 客户端发起请求,用线程来处理连接的建立,这样可以实现多任务(也就是并发) 连接后根据请求发送指定页面 ...
- Java并发编程之基础理论
内存模型 主内存.工作内存与Java堆.栈.方法区并不是同一个层次的内存划分 勉强对应起来 从定义来看,主内存对应Java堆中对象实例数据部分,工作内存对应虚拟机栈中部分区域 从更低层次来说,主内 ...
- java例题_25 判断是否为回文数!
1 /*25 [程序 25 求回文数] 2 题目:一个 5 位数,判断它是不是回文数.即 12321 是回文数,个位与万位相同,十位与千位相同. 3 */ 4 5 /*分析 6 * 先用%和/将5个数 ...
- tasker支持的shell 命令大全
参考 http://www.notenoughtech.com/tasker/tasker-run-shell-commands/ 罗列所有系统配置项 settings list system s ...
- 实现FTP+PAM+MySQL环境,批量配置虚拟用户
实现FTP+PAM+MySQL环境,批量配置虚拟用户 搭建环境: CentOS6.5或CentOS6.7 [root@vhost3 ~]# uname -a Linux vhost3 2.6.32-5 ...