博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4965 Fast Matrix Calculation 矩阵快速幂
阅读量:4884 次
发布时间:2019-06-11

本文共 2414 字,大约阅读时间需要 8 分钟。

题意:

给出一个\(n \times k\)的矩阵\(A\)和一个\(k \times n\)的矩阵\(B\),其中\(4 \leq N \leq 1000, \, 2 \leq K \leq 6\)

矩阵\(C=A \cdot B\),求矩阵\(C^{N^2}\)的各个元素之和,以上矩阵运算均是在模\(6\)的情况下计算的。

分析:

如果我们直接计算\(A \cdot B\)的话,这个矩阵非常大,不可能进行快速幂计算。

所以要变形一下,
\((A \cdot B)^{N^2}=A \cdot (B \cdot A)^{N^2-1} \cdot B\)
而矩阵\(B \cdot A\)非常小,问题就解决了。

#include 
#include
#include
using namespace std;const int maxn = 1000 + 10;const int MOD = 6;inline int mul_mod(int a, int b) { return a * b % MOD;}inline void add_mod(int& a, int b) { a += b; if(a >= 6) a -= 6;}int N, K, A[maxn][MOD], B[MOD][maxn];int tmp[maxn][MOD], res[maxn][maxn];struct Matrix{ int a[MOD][MOD]; Matrix() { memset(a, 0, sizeof(a)); } Matrix operator * (const Matrix& t) const { Matrix ans; for(int i = 0; i < K; i++) for(int j = 0; j < K; j++) if(a[i][j]) for(int k = 0; k < K; k++) add_mod(ans.a[i][k], mul_mod(a[i][j], t.a[j][k])); return ans; }};Matrix pow_mod(Matrix a, int n) { Matrix ans; for(int i = 0; i < K; i++) ans.a[i][i] = 1; while(n) { if(n & 1) ans = ans * a; a = a * a; n >>= 1; } return ans;}int main(){ while(scanf("%d%d", &N, &K) == 2 && N) { for(int i = 0; i < N; i++) for(int j = 0; j < K; j++) scanf("%d", &A[i][j]); for(int i = 0; i < K; i++) for(int j = 0; j < N; j++) scanf("%d", &B[i][j]); Matrix M; for(int i = 0; i < K; i++) for(int j = 0; j < N; j++) if(B[i][j]) for(int k = 0; k < K; k++) add_mod(M.a[i][k], mul_mod(B[i][j], A[j][k])); M = pow_mod(M, N * N - 1); memset(tmp, 0, sizeof(tmp)); memset(res, 0, sizeof(res)); for(int i = 0; i < N; i++) for(int j = 0; j < K; j++) if(A[i][j]) for(int k = 0; k < K; k++) add_mod(tmp[i][k], mul_mod(A[i][j], M.a[j][k])); for(int i = 0; i < N; i++) for(int j = 0; j < K; j++) if(tmp[i][j]) for(int k = 0; k < N; k++) add_mod(res[i][k], mul_mod(tmp[i][j], B[j][k])); int ans = 0; for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) ans += res[i][j]; printf("%d\n", ans); } return 0;}

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/5256784.html

你可能感兴趣的文章
文章搜集
查看>>
关于逻辑思维题
查看>>
OpenStack - liberty CentOS 7
查看>>
docker部署nginx,并实现负载均衡。
查看>>
石子合并
查看>>
IAR中 C语言位定义
查看>>
Windows 7下硬盘安装Ubuntu 14.04图文教程
查看>>
android中XML文件解析遇到“not well-formed (invalid token)”解决办法
查看>>
软件测试第二次作业:初识JUNIT的单元测试方法
查看>>
acm寒假特辑1月18日 HDU-1420(数学优化算法)
查看>>
double类型数据在内存中中存储格式
查看>>
[App Store Connect帮助]三、管理 App 和版本(2.3)输入 App 信息:提供自定许可协议...
查看>>
[Swift]LeetCode728. 自除数 | Self Dividing Numbers
查看>>
macOS 10.13 安装Virtualbox失败
查看>>
正则表达式之我见—后向引用
查看>>
[Cypress] Test XHR Failure Conditions with Cypress
查看>>
[RxJS] Completing a Stream with TakeWhile
查看>>
一、基础篇--1.1Java基础-MVC设计思想
查看>>
将eclipse的应用程序打包成.exe
查看>>
Apache mod_fcgid fcgid_header_bucket_read函数缓冲区溢出漏洞
查看>>