题意:已知N*N的矩阵A,输出矩阵A + A2 + A3 + . . . + Ak,每个元素只输出最后一个数字。

分析:

A + A2 + A3 + . . . + An可整理为下式,

从而可以用log2(n)的复杂度算出结果。

注意:输入时把矩阵A的每个元素对10取余,因为若不处理,会导致k为1的时候结果出错。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<iostream>
#include<sstream>
#include<iterator>
#include<algorithm>
#include<string>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#define lowbit(x) (x & (-x))
const double eps = 1e-8;
inline int dcmp(double a, double b){
if(fabs(a - b) < eps) return 0;
return a > b ? 1 : -1;
}
typedef long long LL;
typedef unsigned long long ULL;
const int INT_INF = 0x3f3f3f3f;
const int INT_M_INF = 0x7f7f7f7f;
const LL LL_INF = 0x3f3f3f3f3f3f3f3f;
const LL LL_M_INF = 0x7f7f7f7f7f7f7f7f;
const int dr[] = {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[] = {-1, 1, 0, 0, -1, 1, -1, 1};
const int MOD = 10;
const double pi = acos(-1.0);
const int MAXN = 40 + 10;
const int MAXT = 10000 + 10;
using namespace std;
int n;
struct Matrix{
int r, c, matrix[MAXN][MAXN];
Matrix(int rr, int cc):r(rr), c(cc){
memset(matrix, 0, sizeof matrix);
}
};
Matrix add(Matrix a, Matrix b){
Matrix ans(n, n);
for(int i = 0; i < a.r; ++i){
for(int j = 0; j < a.c; ++j){
ans.matrix[i][j] = ((a.matrix[i][j] % MOD) + (b.matrix[i][j] % MOD)) % MOD;
}
}
return ans;
}
Matrix mul(Matrix a, Matrix b){
Matrix ans(a.r, b.c);
for(int i = 0; i < a.r; ++i){
for(int j = 0; j < b.c; ++j){
for(int k = 0; k < a.c; ++k){
(ans.matrix[i][j] += ((a.matrix[i][k] % MOD) * (b.matrix[k][j] % MOD)) % MOD) %= MOD;
}
}
}
return ans;
}
Matrix QPOW(Matrix a, int k){
Matrix ans(n, n);
for(int i = 0; i < n; ++i){
ans.matrix[i][i] = 1;
}
while(k){
if(k & 1) ans = mul(ans, a);
a = mul(a, a);
k >>= 1;
}
return ans;
}
Matrix solve(Matrix tmp, int k){
if(k == 1) return tmp;
Matrix t = solve(tmp, k >> 1);
Matrix ans = add(t, mul(QPOW(tmp, k >> 1), t));
if(k & 1) ans = add(ans, QPOW(tmp, k));
return ans;
}
int main(){
int k;
while(scanf("%d%d", &n, &k) == 2){
if(n == 0) return 0;
Matrix tmp(n, n);
for(int i = 0; i < n; ++i){
for(int j = 0; j < n; ++j){
scanf("%d", &tmp.matrix[i][j]);
tmp.matrix[i][j] %= MOD;
}
}
Matrix ans = solve(tmp, k);
for(int i = 0; i < ans.r; ++i){
for(int j = 0; j < ans.c; ++j){
if(j) printf(" ");
printf("%d", ans.matrix[i][j]);
}
printf("\n");
}
printf("\n");
}
return 0;
}

  

UVA - 11149 Power of Matrix(矩阵倍增)的更多相关文章

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

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

  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 (矩阵快速幂,倍增法或构造矩阵)

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

  4. UVa 11149 Power of Matrix 矩阵快速幂

    题意: 给出一个\(n \times n\)的矩阵\(A\),求\(A+A^2+A^3+ \cdots + A^k\). 分析: 这题是有\(k=0\)的情况,我们一开始先特判一下,直接输出单位矩阵\ ...

  5. UVA 11149 Power of Matrix 快速幂

    题目链接: http://acm.hust.edu.cn/vjudge/contest/122094#problem/G Power of Matrix Time Limit:3000MSMemory ...

  6. UVA 11149 Power of Matrix 构造矩阵

    题目大意:意思就是让求A(A是矩阵)+A2+A3+A4+A5+A6+······+AK,其中矩阵范围n<=40,k<=1000000. 解题思路:由于k的取值范围很大,所以很自然地想到了二 ...

  7. UVA 11149 Power of Matrix

    矩阵快速幂. 读入A矩阵之后,马上对A矩阵每一个元素%10,否则会WA..... #include<cstdio> #include<cstring> #include< ...

  8. UVA11149 Power of Matrix —— 矩阵倍增、矩阵快速幂

    题目链接:https://vjudge.net/problem/UVA-11149 题意: 给出矩阵A,求出A^1 + A^2 …… + A^k . 题解: 1.可知:A^1 + A^2 …… + A ...

  9. UVA 11149.Power of Matrix-矩阵快速幂倍增

    Power of Matrix UVA - 11149       代码: #include <cstdio> #include <cstring> #include < ...

随机推荐

  1. 如何给Sqlite添加复合主键

    如果是想两个字段组成一个复合主键的话可以如下.SQL code sqlite> create table t2 ( ...> id1 int , ...> id2 int, ...& ...

  2. Vue.js 内联样式绑定style

    html <div class="Menu" v-bind:style="{height:clientHeight}"> </div> ...

  3. 5、mysql的连接查询

    1.内联查询 >inner join 或 join 2.外联查询 (1)左连接 >left outer join 或 left join (2)右连接 >right outer jo ...

  4. centos7下安装JDK1.8

    步骤1:Oracle下载jdk-8u141-linux-x64安装包 步骤2:解压jdk-8u141-linux-x64.tar.gz到home目录 [root@model ~]# tar -zxvf ...

  5. 嵊州普及Day4T4

    题意:求最长上升序列长度和方案数. 思路:经典DP,不需什么别的东西,加一个数组储蓄程序数即可,原题300000可能N2会有问题,但问题不大. 见代码: #include<iostream> ...

  6. mysql any和all的用法

      1.ANY关键字假设any内部的查询语句返回的结果个数是三个,如:result1,result2,result3,那么, select ...from ... where a > any(. ...

  7. upload-labs-env文件上传漏洞 1-10关

    Pass-01 首先先看源码: function checkFile() { ].value; if (file == null || file == "") { alert(&q ...

  8. oracle 查看表中有多少字段

    select count(*) from user_tab_columns t where t.TABLE_NAME='WPM_CHECK_ORDER'

  9. SQL语句利用日志写shell拿权限

    outfile被禁止,或者写入文件被拦截: 在数据库中操作如下:(必须是root权限) show variables like '%general%'; #查看配置 set global genera ...

  10. eclipse环境变量设置

    eclipse的运行需要java,但是当安装了多个版本的jdk后,eclipse可能就不能用了. 解决办法就是: #eclipse 文件夹下有eclipse.ini配置文件,在文件首行添加如下信息: ...