题意:

给出一个\(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 <cstdio>
#include <cstring>
#include <algorithm>
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;
}

最新文章

  1. 第三方Girdview中文件下载的方法,以及js显示图片
  2. 在android中用跑马灯的效果显示textview
  3. ASP.NET、C#调用外部可执行exe文件--多种方案
  4. IOS内存管理学习笔记
  5. 超实用PHP函数总结整理
  6. 第七届河南省赛F.Turing equation(模拟)
  7. 【C++】浅谈三大特性之一继承(一)
  8. 在Mac上搭建React Native开发环境
  9. 2018-2019-2 《网络对抗技术》Exp3 免杀原理与实践 20165215
  10. bzoj 5099: [POI2018]Pionek
  11. vscode 创建.net core mvc
  12. mysql中表里的数据重新设置自增的id的方法
  13. 使用Node.JS监听文件夹变化
  14. mybatis学习四 mybatis的三种查询方式
  15. 关于python内存地址问题
  16. BZOJ 1010: [HNOI2008]玩具装箱toy(斜率优化dp)
  17. 021.13 IO流 RandomAccessFile对象
  18. ie兼容placeholder效果
  19. jQuery多重事件绑定
  20. Spring 多数据源 @Transactional 注解事务管理

热门文章

  1. NodeJS学习视频
  2. for循环操作DOM缓存节点长度?
  3. OPEN SQL
  4. JavaScript是什么
  5. 从零开始的Lua宅[1]:编译Lua解释器
  6. Js中的字符串/数组中常用的操作
  7. iOS开发 - Protocol协议及委托代理(Delegate)
  8. ALTER AVAILABILITY GROUP (Transact-SQL)
  9. Java 文件操作-File
  10. phar打包项目压力对比测试