https://vjudge.net/problem/UVA-11149

题意:

输入一个n×n矩阵A,计算A+A^2+A^3+...A^k的值。

思路:

矩阵倍增法。

处理方法如下,一直化简下去直到变成A。

代码如下:

 Matrix solve(Matrix base,int x)
{
if(x==)return base;
Matrix temp=solve(base,x/);
Matrix sum=add(temp,multi(pow(base,x/),temp));
if(x&)
sum=add(pow(base,x),sum);
return sum;
}
 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
using namespace std; const int maxn=+;
const int MOD=; int n,k; struct Matrix
{
int mat[maxn][maxn];
}base; Matrix multi(Matrix a,Matrix b)
{
Matrix temp;
for(int i=;i<n;i++)
for(int j=;j<n;j++)
{
temp.mat[i][j]=;
for(int k=;k<n;k++)
temp.mat[i][j]=(temp.mat[i][j]+a.mat[i][k]*b.mat[k][j])%MOD;
}
return temp;
} Matrix pow(Matrix a,int x)
{
Matrix res;
memset(res.mat,,sizeof(res.mat));
for(int i=;i<n;i++) res.mat[i][i]=;
while(x)
{
if(x&) res=multi(res,a);
a=multi(a,a);
x>>=;
}
return res;
} Matrix add(Matrix a,Matrix b)
{
Matrix temp;
for(int i=;i<n;i++)
for(int j=;j<n;j++)
temp.mat[i][j]=(a.mat[i][j]+b.mat[i][j])%MOD;
return temp;
} Matrix solve(Matrix base,int x)
{
if(x==)return base;
Matrix temp=solve(base,x/);
Matrix sum=add(temp,multi(pow(base,x/),temp));
if(x&)
sum=add(pow(base,x),sum);
return sum;
} int main()
{
//freopen("D:\\input.txt","r",stdin);
while(~scanf("%d%d",&n,&k) &&n)
{
for(int i=;i<n;i++)
for(int j=;j<n;j++)
{
scanf("%d",&base.mat[i][j]);
base.mat[i][j]%=MOD;
}
Matrix ans=solve(base,k);
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
if(j) printf(" ");
printf("%d",ans.mat[i][j]);
}
printf("\n");
}
printf("\n");
}
return ;
}

UVa 11149 矩阵的幂(矩阵倍增法模板题)的更多相关文章

  1. UVa 11149 Power of Matrix (矩阵快速幂,倍增法或构造矩阵)

    题意:求A + A^2 + A^3 + ... + A^m. 析:主要是两种方式,第一种是倍增法,把A + A^2 + A^3 + ... + A^m,拆成两部分,一部分是(E + A^(m/2))( ...

  2. UVa 11149 Power of Matrix(倍增法、矩阵快速幂)

    题目链接: 传送门 Power of Matrix Time Limit: 3000MS      Description 给一个n阶方阵,求A1+A2+A3+......Ak. 思路 A1+A2+. ...

  3. UVA 11149 - Power of Matrix(矩阵乘法)

    UVA 11149 - Power of Matrix 题目链接 题意:给定一个n*n的矩阵A和k,求∑kiAi 思路:利用倍增去搞.∑kiAi=(1+Ak/2)∑k/2iAi,不断二分就可以 代码: ...

  4. 2019牛客多校第五场 B - generator 1 矩阵快速幂+十倍增+二进制倍增优化

    B - generator 1 题意 给你\(x_{0}.x_{1}.a.b.b.mod\),根据\(x_{i} = a*x_{i-1} + b*x_{i-2}\)求出\(x_{n}\) 思路 一般看 ...

  5. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

  6. [POJ 3150] Cellular Automaton (矩阵高速幂 + 矩阵乘法优化)

    Cellular Automaton Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 3048   Accepted: 12 ...

  7. POJ 3734 Blocks(矩阵快速幂+矩阵递推式)

    题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数. 该题我们可以想到一个递推式 .   设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数 ...

  8. lightoj 1096【矩阵快速幂(作为以后的模板)】

    基础矩阵快速幂何必看题解 #include <bits/stdc++.h> using namespace std; /* 0 1 2 3 4 5 6 7 0 0 0 */ const i ...

  9. 矩阵快速幂/矩阵加速线性数列 By cellur925

    讲快速幂的时候就提到矩阵快速幂了啊,知道是个好东西,但是因为当时太蒟(现在依然)没听懂.现在把它补上. 一.矩阵快速幂 首先我们来说说矩阵.在计算机中,矩阵通常都是用二维数组来存的.矩阵加减法比较简单 ...

随机推荐

  1. nodejs基础【持续更新中】

    简介 Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-dr ...

  2. centos7修改hostname和hosts

    1.修改/etc/hostname vi /etc/hostname 打开之后的内容是: localhost.localdomain 把它修改成想要的名字就可以,比如:master 保存退出 2.修改 ...

  3. 一个误区(关于javascript的字符串拼接)

    前段时间听说了一个问题,说是,javascript中使用+=来拼接字符串会比使用Array的join方法慢几十倍以上,今天在工作间歇,就写了个例 子验证了一下,结果确完全相反,使用+=比join要快( ...

  4. Go学习笔记一:解析toml配置文件

    本文系作者原创,转载请注明出处https://www.cnblogs.com/sonofelice/p/9085291.html . 一些mysql或者日志路径的信息需要放在配置文件中.那么本博文主要 ...

  5. 解决hung_task_timeout_secs问题【方法待校验】

    问题描述:   kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this messag ...

  6. IIS7.5 错误代码0x8007007e HTTP 错误 500.19

    目录 问题案例 解决问题 参考资料 问题案例 今天在win2008+IIS7.5的环境中部署WCF服务后,一直出现无法打开的页面.具体错误信息如下: HTTP 错误 500.19 - Internal ...

  7. 思辨“从外至内的认识和表达”——By Me at 20140928

                                                              从下面几个维度,来思辨“从外至内的认识和表达” [思考维度1]提到研发前期的架构工作 ...

  8. django views.py视图 获取用户请求相关信息以及请求头

    请求的其他信息 用户发来请求时候,不仅发来数据,也把请求头也发过来 在views.py 怎么找请求数据? request是一个对象,这个对象封装很多信息,可以先查这个对象的类 print(type(r ...

  9. linux下dubbo调试 ---telnet命令

    linux下启动dubbo服务端, 怎么调试? 方法有二: 1. 自己写简单消费者功能,进行各种情况测试.(这确实是有必要的) 2. 使用telnet直接连接上dubbo,使用命令调用,然后调试.(这 ...

  10. 如何进入单用户模式(CentOS6.9)

    环境: CentOS6.9_64位 步骤1 虚拟机此时处在关机模式,开机后在下图界面4秒倒计时结束前,按 e 步骤2 此时会进入下图所示界面,接着按一下 e 步骤3 此时会进入下图所示的界面,选择第2 ...