题意:

给出一个\(n \times n\)的矩阵\(A\),求\(A+A^2+A^3+ \cdots + A^k\)。

分析:

这题是有\(k=0\)的情况,我们一开始先特判一下,直接输出单位矩阵\(E\)。

下面讨论\(k > 0\)的情况:

方法一

设答案为\(S_k(k > 0)\)

把矩阵增广一下

$\begin{bmatrix}

A & O \

E & E

\end{bmatrix}

\begin{bmatrix}

A^n\

S_{n-1}

\end{bmatrix}

\begin{bmatrix}

A^{n+1}\

S_n

\end{bmatrix}\(
\)E\(表示单位矩阵,\)O\(是全为零的矩阵。
\){\begin{bmatrix}

A & O \

E & E

\end{bmatrix}}^k

\begin{bmatrix}

A\

O

\end{bmatrix}

\begin{bmatrix}

A^{k+1}\

S_k

\end{bmatrix}$

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = 40;
const int MOD = 10; int mul(int a, int b) { return a * b % MOD; } void add(int& a, int b) { a += b; if(a >= MOD) a -= MOD; } int n, k, sz;
int a[maxn][maxn], b[maxn][maxn]; struct Matrix
{
int a[maxn * 2][maxn * 2]; Matrix() { memset(a, 0, sizeof(a)); } Matrix operator * (const Matrix& t) const {
Matrix ans;
for(int i = 0; i < sz; i++)
for(int j = 0; j < sz; j++)
for(int k = 0; k < sz; k++)
add(ans.a[i][j], mul(a[i][k], t.a[k][j]));
return ans;
} void output() {
for(int i = 0; i < sz; i++) {
for(int j = 0; j < sz - 1; j++)
printf("%d ", a[i][j]);
printf("%d\n", a[i][sz - 1]);
}
printf("\n");
}
}; Matrix pow_mod(Matrix a, int p) {
Matrix ans;
for(int i = 0; i < sz; i++) ans.a[i][i] = 1;
while(p) {
if(p & 1) ans = ans * a;
a = a * a;
p >>= 1;
}
return ans;
} int main()
{
while(scanf("%d%d", &n, &k) == 2 && n) {
Matrix M;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++) {
scanf("%d", &a[i][j]);
a[i][j] %= MOD;
M.a[i][j] = a[i][j];
} if(!k) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n - 1; j++)
printf("%d ", i == j ? 1 : 0);
printf("%d\n", i == n - 1 ? 1 : 0);
}
printf("\n");
continue;
} for(int i = n; i < n * 2; i++)
M.a[i][i] = M.a[i][i - n] = 1; sz = n * 2;
M = pow_mod(M, k);
memset(b, 0, sizeof(b));
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++) if(M.a[i + n][j])
for(int k = 0; k < n; k++)
add(b[i][k], mul(M.a[i + n][j], a[j][k])); for(int i = 0; i < n; i++) {
for(int j = 0; j < n - 1; j++)
printf("%d ", b[i][j]);
printf("%d\n", b[i][n - 1]);
}
printf("\n");
} return 0;
}

方法二

有如下递归式:

  • \(S_k=(E+A^{\frac{k}{2}})S^{\frac{k}{2}}\),k是偶数
  • \(S_k=(E+A^{\frac{k}{2}})S^{\frac{k}{2}}+A^k\),k是奇数

所以也可以直接递归求解。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = 40;
const int MOD = 10; int mul(int a, int b) { return a * b % MOD; } void add(int& a, int b) { a += b; if(a >= MOD) a -= MOD; } int n, k; struct Matrix
{
int a[maxn][maxn]; Matrix() { memset(a, 0, sizeof(a)); } void E() {
memset(a, 0, sizeof(a));
for(int i = 0; i < maxn; i++) a[i][i] = 1;
} Matrix operator + (const Matrix& t) const {
Matrix ans;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++) {
add(ans.a[i][j], a[i][j]);
add(ans.a[i][j], t.a[i][j]);
}
return ans;
} Matrix operator * (const Matrix& t) const {
Matrix ans;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++) if(a[i][j])
for(int k = 0; k < n; k++)
add(ans.a[i][k], mul(a[i][j], t.a[j][k]));
return ans;
} void output() {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n - 1; j++)
printf("%d ", a[i][j]);
printf("%d\n", a[i][n - 1]);
}
printf("\n");
}
}; Matrix pow_mod(Matrix a, int p) {
Matrix ans;
ans.E();
while(p) {
if(p & 1) ans = ans * a;
a = a * a;
p >>= 1;
}
return ans;
} Matrix E; Matrix sum(Matrix a, int p) {
if(p == 1) return a;
Matrix ans;
ans = (E + pow_mod(a, p / 2)) * sum(a, p / 2);
if(p & 1) ans = ans + pow_mod(a, p);
return ans;
} int main()
{
E.E();
while(scanf("%d%d", &n, &k) == 2) {
if(n == 0 && k == 0) break;
Matrix a;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++) {
scanf("%d", &a.a[i][j]);
a.a[i][j] %= 10;
} if(k == 0) {
E.output();
continue;
} a = sum(a, k);
a.output();
} return 0;
}

UVa 11149 Power of Matrix 矩阵快速幂的更多相关文章

  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(矩阵乘法)

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

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

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

  4. POJ 3233 Matrix Power Series(矩阵快速幂)

    Matrix Power Series Time Limit: 3000MS Memory Limit: 131072K Total Submissions: 19338 Accepted: 8161 ...

  5. POJ 3233 Matrix Power Series (矩阵快速幂+二分求解)

    题意:求S=(A+A^2+A^3+...+A^k)%m的和 方法一:二分求解S=A+A^2+...+A^k若k为奇数:S=(A+A^2+...+A^(k/2))+A^(k/2)*(A+A^2+...+ ...

  6. POJ 3233 Matrix Power Series (矩阵快速幂)

    题目链接 Description Given a n × n matrix A and a positive integer k, find the sum S = A + A^2 + A^3 + - ...

  7. 题解报告:poj 3233 Matrix Power Series(矩阵快速幂)

    题目链接:http://poj.org/problem?id=3233 Description Given a n × n matrix A and a positive integer k, fin ...

  8. poj3233 Matrix Power Series(矩阵快速幂)

    题目要求的是 A+A2+...+Ak,而不是单个矩阵的幂. 那么可以构造一个分块的辅助矩阵 S,其中 A 为原矩阵,E 为单位矩阵,O 为0矩阵    将 S 取幂,会发现一个特性: Sk +1右上角 ...

  9. fzu 1911 Construct a Matrix(矩阵快速幂+规律)

    题目链接:fzu 1911 Construct a Matrix 题目大意:给出n和m,f[i]为斐波那契数列,s[i]为斐波那契数列前i项的和.r = s[n] % m.构造一个r * r的矩阵,只 ...

随机推荐

  1. enable assembly bind failure logging (Fusion) in .NET

    今天遇到新建wcf项目编译成64位版本在64位windows上无法运气的,问题 先百度了一下如何查看程序集加载日志: Add the following values to HKEY_LOCAL_MA ...

  2. 十六进制和ASCII之间的转换

    2.关于两个byte[]数组的合并: public static byte[] byteMerger(byte[] byte_1, byte[] byte_2) { byte[] byte_3 = n ...

  3. JavaScript笔记5-事件

    一.概述: 事件是可以被JavaScript侦测到的行为.网页中的每个元素都可以产生某些可以触发JavaScript函数的事件.相当于让标签在满足某种条件的时候,调用指定的方法. 二.常用事件 1:o ...

  4. myeclipes出现{Could not create the view: An unexpected except

    今天编写代码的时候突然出现了web工程不能部署的情况,后面了解到主要是因为那个myeclipse非正常关闭或者突然断电的情况,我的是属于第一种的,下面整理一下这个解决方法 1.关闭myeclipse ...

  5. 三维GIS-室内寻径功能实现

    期末,要交一个大作业,正巧之前跑国图借书的时候,晕头转向的,国图内居然没有导航!!!借这个机会做一个室内导航的demo,只是半成品,还需要加入室内定位,匹配一下坐标才能在实际中使用. demo:利用蜂 ...

  6. HDU - 5493 Queue 2015 ACM/ICPC Asia Regional Hefei Online(线段树)

    按身高排序,每个人前面最高的人数有上限,如果超出上限说明impossible, 每次考虑最小的人,把他放在在当前的从左往右第k+1个空位 因为要求字典序最小,所以每次k和(上限-k)取min值. 没有 ...

  7. Python socket 粘包

    目录 1 TCP的三次握手四次挥手 0 1.1 三次握手 1 1.2 四次挥手 2 2 粘包现象 3 2.1 基于TCP制作远程执行命令操作(win服务端) 4 2.1 基于TCP制作远程执行命令操作 ...

  8. MFC:AfxSetResourceHandle

    AfxGetResourceHandle用于获取当前资源模块句柄. 而AfxSetResourceHandle则用于设置程序目前要使用的资源模块句柄,一般在InitInstance()里调用.

  9. Luogu P1666 前缀单词

    校内资格赛题目,差点高一就要\(\tt{AFO}\)了 30分思路 对30%的数据,满足$1≤n≤10 $ 所以我们可以子集枚举,实际得分40pts #include<iostream> ...

  10. 基于arcgis api for js高速公路智能化智慧公路养护WebGIS开源系统

    伴随着高速公路建设进程加快,其涉及信息量增大.类型多样.地点分布广,传统的信息管理方式已不适应公路建设迅速发展的需要,而目前能对高速公路在设计.施工.养护等阶段的各类信息综合进行管理的信息系统尚较少见 ...