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
讲快速幂的时候就提到矩阵快速幂了啊,知道是个好东西,但是因为当时太蒟(现在依然)没听懂.现在把它补上. 一.矩阵快速幂 首先我们来说说矩阵.在计算机中,矩阵通常都是用二维数组来存的.矩阵加减法比较简单 ...
随机推荐
- Ningx代码研究.
概述 研究计划 参与人员 研究文档 学习emiller的文章 熟悉nginx的基本数据结构 nginx 代码的目录结构 nginx简单的数据类型的表示 nginx字符串的数据类型的表示 内存分配相关 ...
- python学习笔记(八)python操作Excel
一.python操作excel,python操作excel使用xlrd.xlwt和xlutils模块,xlrd模块是读取excel的,xlwt模块是写excel的,xlutils是用来修改excel的 ...
- PAT 1136 A Delayed Palindrome[简单]
1136 A Delayed Palindrome (20 分) Consider a positive integer N written in standard notation with k+1 ...
- Creating an generated Earth AVI with C++
Creating an generated Earth AVI with C++ EarthGenerator.cpp /* EarthGenerator.cpp An examp ...
- C# 获取计算机cpu 硬盘 网卡信息
/// <summary>/// 机器码 /// </summary> public class MachineCode { ...
- vue Element-ui 表格自带筛选框自定义高度
el-table中可以在一行的某列进行筛选,代码如下: <el-table-column prop="classOfTest" class="test" ...
- [Windows Powershell]-学习笔记(3)
Powershell 通过函数扩展别名 在powershell中设置别名的确方便快捷,但是在设置别名的过程中并设置参数的相关信息,尽管别名会自动识别参数,但是如何把经常使用的参数默认设定在别名里面呢? ...
- PL/SQL编程-块编程
(1). 简单分类 |————过程(存储过程) | ...
- docker swarm overlay stack 服务部署记录
项目xxx(后端),xxx-ui前端(前后端分离的项目) 依赖mysql,elasticsearch.分别制作了四个镜像来做这件事.希望可以制作跨主机的部署,使用了swarm,以下是学习记录. 参考 ...
- Unity本地数据存储---Sqlite和JSON
2014-05-04更新 SqliteDatabase.cs这个文件的初始方法有问题,具体是如果指定URL已经存在了DB文件,就不会重新覆盖DB文件. 这导致我们修改之后的DB文件无法产生效果. 本人 ...