UVa 11149 矩阵的幂(矩阵倍增法模板题)
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 矩阵的幂(矩阵倍增法模板题)的更多相关文章
- UVa 11149 Power of Matrix (矩阵快速幂,倍增法或构造矩阵)
题意:求A + A^2 + A^3 + ... + A^m. 析:主要是两种方式,第一种是倍增法,把A + A^2 + A^3 + ... + A^m,拆成两部分,一部分是(E + A^(m/2))( ...
- UVa 11149 Power of Matrix(倍增法、矩阵快速幂)
题目链接: 传送门 Power of Matrix Time Limit: 3000MS Description 给一个n阶方阵,求A1+A2+A3+......Ak. 思路 A1+A2+. ...
- UVA 11149 - Power of Matrix(矩阵乘法)
UVA 11149 - Power of Matrix 题目链接 题意:给定一个n*n的矩阵A和k,求∑kiAi 思路:利用倍增去搞.∑kiAi=(1+Ak/2)∑k/2iAi,不断二分就可以 代码: ...
- 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}\) 思路 一般看 ...
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- [POJ 3150] Cellular Automaton (矩阵高速幂 + 矩阵乘法优化)
Cellular Automaton Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 3048 Accepted: 12 ...
- POJ 3734 Blocks(矩阵快速幂+矩阵递推式)
题意:个n个方块涂色, 只能涂红黄蓝绿四种颜色,求最终红色和绿色都为偶数的方案数. 该题我们可以想到一个递推式 . 设a[i]表示到第i个方块为止红绿是偶数的方案数, b[i]为红绿恰有一个是偶数 ...
- lightoj 1096【矩阵快速幂(作为以后的模板)】
基础矩阵快速幂何必看题解 #include <bits/stdc++.h> using namespace std; /* 0 1 2 3 4 5 6 7 0 0 0 */ const i ...
- 矩阵快速幂/矩阵加速线性数列 By cellur925
讲快速幂的时候就提到矩阵快速幂了啊,知道是个好东西,但是因为当时太蒟(现在依然)没听懂.现在把它补上. 一.矩阵快速幂 首先我们来说说矩阵.在计算机中,矩阵通常都是用二维数组来存的.矩阵加减法比较简单 ...
随机推荐
- ubuntu14下创建软件的快捷启动方式
下载软件,使用softname/bin/softname.sh即可启动,但是很麻烦,每次都要打开terminal 为了方便,我们需要创建desktop文件指向这个启动软件的shell文件(以创建Pyc ...
- Win查询注册表获取CPU与内存参数
#include "stdafx.h" void dump_machine_info( HANDLE fh ) { CHAR Str[MAX_PATH*3]; CHAR MHzSt ...
- servlet实现多文件打包下载
当用户一次下载多个文件时.普通情况是,每下载一个文件,均要弹出一个下载的对话框.这给用户造成了非常大不便. 比較理想的情况是,用户选择多个文件后.server后端直接将多个文件打包为zip.以下贴出实 ...
- 以EJB谈J2EE规范
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/xiaoduishenghuogo/article/details/24800703 接触J2EE的时 ...
- DiskLruCache详解 From GuoLin Blogs.
作者:郭霖老师,<第一行代码>作者,开源框架LitePal作者 http://blog.csdn.net/guolin_blog/article/details/28863651 概述 记 ...
- MBR和GPT(分区)
MBR:Master Boot Record GPT:Guid Partition Table (全局唯一标识符分区表) GPT is the new standard and is graduall ...
- python爬虫中文乱码解决方法
python爬虫中文乱码 前几天用python来爬取全国行政区划编码的时候,遇到了中文乱码的问题,折腾了一会儿,才解决.现特记录一下,方便以后查看. 我是用python的requests和bs4库来实 ...
- Python(异常处理)
一 错误和异常 程序中难免出现错误,而错误分成两种 1.语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) 2.逻辑错误(逻辑错误) 什么是异常 异常就是程序运行时发 ...
- idea构建一个简单的maven_web项目
软件说明 好啦,开始创建mave的web项目啦!
- Winter-1-B Sum 解题报告及测试数据
Time Limit:500MS Memory Limit:32768KB Description Hey, welcome to HDOJ(Hangzhou Dianzi University O ...