题目链接:https://vjudge.net/problem/HDU-4965

Fast Matrix Calculation

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 2057    Accepted Submission(s): 954

Problem Description
One day, Alice and Bob felt bored again, Bob knows Alice is a girl who loves math and is just learning something about matrix, so he decided to make a crazy problem for her.

Bob has a six-faced dice which has numbers 0, 1, 2, 3, 4 and 5 on each face. At first, he will choose a number N (4 <= N <= 1000), and for N times, he keeps throwing his dice for K times (2 <=K <= 6) and writes down its number on the top face to make an N*K matrix A, in which each element is not less than 0 and not greater than 5. Then he does similar thing again with a bit difference: he keeps throwing his dice for N times and each time repeat it for K times to write down a K*N matrix B, in which each element is not less than 0 and not greater than 5. With the two matrix A and B formed, Alice’s task is to perform the following 4-step calculation.

Step 1: Calculate a new N*N matrix C = A*B.
Step 2: Calculate M = C^(N*N). 
Step 3: For each element x in M, calculate x % 6. All the remainders form a new matrix M’.
Step 4: Calculate the sum of all the elements in M’.

Bob just made this problem for kidding but he sees Alice taking it serious, so he also wonders what the answer is. And then Bob turn to you for help because he is not good at math.

 
Input
The input contains several test cases. Each test case starts with two integer N and K, indicating the numbers N and K described above. Then N lines follow, and each line has K integers between 0 and 5, representing matrix A. Then K lines follow, and each line has N integers between 0 and 5, representing matrix B.

The end of input is indicated by N = K = 0.

 
Output
For each case, output the sum of all the elements in M’ in a line.
 
Sample Input
4 2
5 5
4 4
5 4
0 0
4 2 5 5
1 3 1 5
6 3
1 2 3
0 3 0
2 3 4
4 3 2
2 5 5
0 5 0
3 4 5 1 1 0
5 3 2 3 3 2
3 1 5 4 5 2
0 0
 
Sample Output
14
56
 
Author
SYSU
 
Source

题意:

A为矩阵n*k,B为矩阵k*n,其中n<=1e3, k<=6。求 (A*B)^(n*n) 矩阵中所有项模6之和。

题解:

1.如果先计算 A*B的矩阵,然后再快速幂,那么矩阵最大可达:1e3*1e3,计算量是十分庞大的。

2. (A*B)^(n*n) = A*B*A*B*A*B*A*B……*A*B = A*(B*A)^(n*n-1)*B,其中B*A最大只为6*6,因而可先用矩阵快速幂算出(B*A)^(n*n-1),然后再计算A*(B*A)^(n*n-1)*B。

原理:矩阵乘法虽然不满足交换律,但是乘法的执行顺序却可以任意

代码如下:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <set>
using namespace std;
typedef long long LL;
const int INF = 2e9;
const LL LNF = 9e18;
//const int MOD = 1000000007;
const int MAXN = 1e6+; const int MOD = ;
const int Size = ;
struct MA
{
int mat[Size][Size];
void init()
{
for(int i = ; i<Size; i++)
for(int j = ; j<Size; j++)
mat[i][j] = (i==j);
}
}; MA mul(MA x, MA y)
{
MA ret;
memset(ret.mat, , sizeof(ret.mat));
for(int i = ; i<Size; i++)
for(int j = ; j<Size; j++)
for(int k = ; k<Size; k++)
ret.mat[i][j] += x.mat[i][k]*y.mat[k][j]%MOD, ret.mat[i][j] %= MOD;
return ret;
} MA qpow(MA x, LL y)
{
MA s;
s.init();
while(y)
{
if(y&) s = mul(s, x);
x = mul(x, x);
y >>= ;
}
return s;
} int a[][], b[][], c[][], M1[][], M2[][];
int main()
{
int n, k;
while(scanf("%d%d", &n,&k) &&(n||k))
{
memset(a, , sizeof(a));
memset(b, , sizeof(b));
memset(c, , sizeof(c)); for(int i = ; i<n; i++)
for(int j = ; j<k; j++)
scanf("%d", &a[i][j]); for(int i = ; i<k; i++)
for(int j = ; j<n; j++)
scanf("%d", &b[i][j]); for(int i = ; i<k; i++)
for(int j = ; j<k; j++)
for(int t = ; t<n; t++)
c[i][j] += b[i][t]*a[t][j]%MOD, c[i][j] %= MOD; MA s;
memcpy(s.mat, c, sizeof(s.mat));
s = qpow(s, n*n-);
memcpy(c, s.mat, sizeof(c)); memset(M1, , sizeof(M1));
for(int i = ; i<n; i++)
for(int j = ; j<k; j++)
for(int t = ; t<k; t++)
M1[i][j] += a[i][t]*c[t][j], M1[i][j] %= MOD; memset(M2, , sizeof(M2));
for(int i = ; i<n; i++)
for(int j = ; j<n; j++)
for(int t = ; t<k; t++)
M2[i][j] += M1[i][t]*b[t][j], M2[i][j] %= MOD; int ans = ;
for(int i = ; i<n; i++)
for(int j = ; j<n; j++)
ans += M2[i][j]; printf("%d\n", ans);
}
}

最新文章

  1. redis迁移工具-redis-migrate-tool使用测试
  2. SQL并行与否的性能差异
  3. Linux 安装挂载时注意事项
  4. 百度或者Google---SEO优化
  5. jQuery Table2CSV插件(表格转CSV) 完美支持colspan和rowspan
  6. Hive(转)
  7. JQuery DataTables Editor---页面内容修改&amp;&amp;数据库信息修改 (2)
  8. zf-关于更改账号密码的问题
  9. redis sentinel 集群监控 配置
  10. C#中的协变(Covariance)和逆变(Contravariance)
  11. 洛谷 P1177 【模板】快速排序【13种排序模版】
  12. [HNOI2014]米特运输
  13. Python——汇总
  14. ios原生项目内嵌u3d工程
  15. freckles
  16. WinForm timer 控件
  17. Python3 自定义请求头消息headers
  18. HDU - 1849 Rabbit and Grass 【Nim博弈】
  19. Win10系列:VC++ Direct3D模板介绍2
  20. .net core Error -4090 EADDRNOTAVAIL address not available”

热门文章

  1. Codeforces Round #321 (Div. 2) Kefa and First Steps 模拟
  2. spring事物,在service层如果进行了异常处理,则不会回滚
  3. MySQL中数据类型(char(n)、varchar(n)、nchar(n)、nvarchar(n)的区别)(转)
  4. javascript --- 多重继承
  5. debian6之eclipse和jdk安装
  6. 在C#的数据类型中,什么属于值类型,什么属于引用类型
  7. ssh登录时不校验被登录机器的方法
  8. python中 urllib, urllib2, httplib, httplib2 几个库的区别
  9. C#中通过反射获取类中非公有成员
  10. hdoj 2188 悼念512汶川大地震遇难同胞——选拔志愿者 【巴什博弈】