uva 11149 - Power of Matrix 【倍增 + 矩阵快速幂】
来源:互联网 发布:4g逛淘宝用多少流量 编辑:程序博客网 时间:2024/04/30 22:25
题意:给你一个n*n的矩阵A,现在要你求出矩阵A + A^1 + A^2 + ... + A^k。 只输出最后一位数字。
思路:倍增法
对于矩阵res = A + A^1 + ... + A^k
若k&1,则有res = (A + A^1 + ... + A^(k/2)) + (A + A^1 + ... + A^(k/2)) * A^(k/2) + A^k。
若k%2==0,则有res = (A + A^1 + ... + A^(k/2)) + (A + A^1 + ... + A^(k/2)) * A^(k/2)。
构造好矩阵就可以了,注意每组数据之间要输一组空行。
AC代码:
#include <cstdio>#include <cstring>#include <cmath>#include <cstdlib>#include <algorithm>#include <queue>#include <stack>#include <map>#include <set>#include <vector>#define INF 0x3f3f3f3f#define eps 1e-8#define MAXN (200+10)#define MAXM (100000)#define Ri(a) scanf("%d", &a)#define Rl(a) scanf("%lld", &a)#define Rf(a) scanf("%lf", &a)#define Rs(a) scanf("%s", a)#define Pi(a) printf("%d\n", (a))#define Pf(a) printf("%.2lf\n", (a))#define Pl(a) printf("%lld\n", (a))#define Ps(a) printf("%s\n", (a))#define W(a) while(a--)#define CLR(a, b) memset(a, (b), sizeof(a))#define MOD 1000000007#define LL long long#define lson o<<1, l, mid#define rson o<<1|1, mid+1, r#define ll o<<1#define rr o<<1|1using namespace std;struct Matrix{ int a[50][50]; int r, c;};Matrix ori, res;Matrix initMatrix(int n){ Matrix x; x.r = x.c = n; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { int y; Ri(y); x.a[i][j] = y % 10; } } return x;}Matrix GetMatrix(int r, int c){ Matrix x; CLR(x.a, 0); x.r = r; x.c = c; for(int i = 0; i < r; i++) x.a[i][i] = 1; return x;}Matrix multi(Matrix x, Matrix y){ Matrix z; CLR(z.a, 0); z.r = x.r; z.c = y.c; for(int i = 0; i < x.r; i++) { for(int k = 0; k < x.c; k++) { if(x.a[i][k] == 0) continue; for(int j = 0; j < y.c; j++) z.a[i][j] = (z.a[i][j] + x.a[i][k] * y.a[k][j]) % 10; } } return z;}Matrix add(Matrix x, Matrix y){ Matrix z; z.r = x.r; z.c = y.c; for(int i = 0; i < x.r; i++) for(int j = 0; j < y.c; j++) z.a[i][j] = (x.a[i][j] + y.a[i][j]) % 10; return z;}Matrix Pow(Matrix x, int n){ Matrix y = GetMatrix(x.r, x.c); while(n) { if(n & 1) y = multi(x, y); x = multi(x, x); n >>= 1; } return y;}Matrix Print(Matrix x){ for(int i = 0; i < x.r; i++) { for(int j = 0; j < x.c; j++) { if(j) printf(" "); printf("%d", x.a[i][j]); } printf("\n"); } printf("\n");}Matrix WorkMatrix(Matrix x, int k){ Matrix a, b, z; if(k == 1) return x; a = WorkMatrix(x, k/2); b = multi(a, Pow(x, k/2)); z = add(a, b); if(k & 1) z = add(z, Pow(x, k)); return z;}int main(){ int n, k; while(scanf("%d%d", &n, &k) != EOF) { if(n == 0) break; ori = initMatrix(n); res = WorkMatrix(ori, k); Print(res); } return 0;}
0 0
- uva 11149 - Power of Matrix 【倍增 + 矩阵快速幂】
- UVA 11149 - Power of Matrix(矩阵倍增)
- uva 11149 - Power of Matrix(矩阵倍增)
- UVA 11149(B)——Power of Matrix (矩阵快速幂,倍增法)
- UVA 11149 Power of Matrix 倍增法
- 7_22_E题 Power of Matrix(矩阵快速幂+倍增)
- uva11149 - Power of Matrix 矩阵倍增
- UVA 11149 Power of Matrix(矩阵+二分)
- UVA 11149 Power of Matrix(矩阵幂和)
- 11149 Power of Matrix(矩阵快速幂)
- 【矩阵幂的和+矩阵快速幂】Power of Matrix UVA
- uva-11149 倍增法矩阵快速幂
- 矩阵的运算 --- 倍增法(UVA11149 - Power of Matrix)
- UVA 11149-Power of Matrix (等比矩阵求和)
- UVA 11149-Power of Matrix (等比矩阵求和)
- Power of Matrix(uva11149+矩阵快速幂)
- UVa 11149 - Power of Matrix
- UVa 11149 - Power of Matrix
- 如何解决电脑横屏问题
- Frame Animation 帧动画
- 【ZYNQ-7000开发之五】PL和PS通过BRAM交互共享数据
- Android之Fragment学习(四)
- 所有Android 开发者都要知道的开发常识
- uva 11149 - Power of Matrix 【倍增 + 矩阵快速幂】
- poj 2976 Dropping tests(最大化平均值)
- 树莓派GPIO引脚
- 【软工文档】机房收费系统之详细设计说明书
- 【设计模式】——总览
- centos7 开启80端口
- C++临时变量什么时候销毁
- Linux下Qt程序的打包发布
- 为什么 Android 手机总是越用越慢?