HDU 4965 Fast Matrix Calculation 矩阵乘法 乘法结合律

一种奇葩的写法,纪念一下当时的RE。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cstdlib>
  5 #include <cmath>
  6 #include <algorithm>
  7 #include <string>
  8 #include <queue>
  9 #include <stack>
 10 #include <vector>
 11 #include <map>
 12 #include <set>
 13 #include <functional>
 14 #include <cctype>
 15 #include <time.h>
 16
 17 using namespace std;
 18
 19 const int INF = 1<<30;
 20 const int MAXN = 1005;
 21
 22 struct Matrix {
 23     int a[MAXN][MAXN];
 24     int col, row;
 25 };
 26
 27 Matrix tMu;
 28
 29 void multiplication(const Matrix &x, const Matrix &y) {
 30     tMu.row= x.row; tMu.col = y.col;
 31     for (int i = 0; i < tMu.row; i++)
 32         for (int j = 0; j < tMu.row; j++) {
 33             tMu.a[i][j] = 0;
 34             for (int k = 0; k < x.col; k++)
 35                 tMu.a[i][j] = (tMu.a[i][j]+x.a[i][k]*y.a[k][j])%6;
 36         }
 37 }
 38
 39 Matrix a, b, ONE;
 40 Matrix t;
 41 Matrix tmp, res;
 42
 43 int n, k;
 44
 45 void pow(const Matrix &x, int d) {
 46     res = ONE; res.col = res.row = x.col;
 47     tmp = x;
 48     while (d>0) {
 49         if (d&1) {
 50             multiplication(res, tmp);
 51             res = tMu;
 52         }
 53         multiplication(tmp, tmp);
 54         tmp = tMu;
 55         d >>= 1;
 56     }
 57 }
 58
 59 void solve() {
 60     multiplication(b, a);
 61     t = tMu;
 62     pow(t, n*n-1);
 63     t = res;
 64     multiplication(a, t);
 65     t = tMu;
 66     multiplication(t, b);
 67     t = tMu;
 68     int ans = 0;
 69     for (int i = 0; i < n; i++) {
 70         for (int j = 0; j < n; j++)
 71             ans += t.a[i][j];
 72     }
 73     printf("%d\n", ans);
 74 }
 75
 76 int main() {
 77     #ifdef Phantom01
 78         freopen("HDU4965.txt", "r", stdin);
 79     #endif //Phantom01
 80
 81     for (int i = 0; i < MAXN; i++) {
 82         for (int j = 0; j < MAXN; j++)
 83             ONE.a[i][j] = 0;
 84         ONE.a[i][i] = 1;
 85     }
 86
 87     while (scanf("%d%d", &n, &k)!=EOF && !(n==0&&k==0)) {
 88         a.row = b.col = n;
 89         a.col = b.row = k;
 90         for (int i = 0; i < n; i++)
 91             for (int j = 0; j < k; j++)
 92                 scanf("%d", &a.a[i][j]);
 93         for (int i = 0; i < k; i++)
 94             for (int j = 0; j < n; j++)
 95                 scanf("%d", &b.a[i][j]);
 96         solve();
 97     }
 98
 99     return 0;
100 }

时间: 2024-11-03 13:31:09

HDU 4965 Fast Matrix Calculation 矩阵乘法 乘法结合律的相关文章

HDU 4965 Fast Matrix Caculation ( 矩阵乘法 + 矩阵快速幂 + 矩阵乘法的结合律 )

HDU 4965 Fast Matrix Calculation ( 矩阵乘法 + 矩阵快速幂 + 矩阵乘法的结合律 ) #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define MAX_SIZE 1001 #define CLR( a, b ) memset( a, b, sizeof(a) ) #define MOD 6 typedef long lo

hdu 4965 Fast Matrix Calculation(矩阵快速幂)

题目链接:hdu 4965 Fast Matrix Calculation 题目大意:给定两个矩阵A,B,分别为N*K和K*N: 矩阵C = A*B 矩阵M=CN?N 将矩阵M中的所有元素取模6,得到新矩阵M' 计算矩阵M'中所有元素的和 解题思路:因为矩阵C为N*N的矩阵,N最大为1000,就算用快速幂也超时,但是因为C = A*B, 所以CN?N=ABAB-AB=AC′N?N?1B,C' = B*A, 为K*K的矩阵,K最大为6,完全可以接受. #include <cstdio> #inc

HDU 4965 Fast Matrix Calculation (矩阵快速幂取模----矩阵相乘满足结合律)

http://acm.hdu.edu.cn/showproblem.php?pid=4965 利用相乘的可结合性先算B*A,得到6*6的矩阵,利用矩阵快速幂取模即可水过. 1 #include<iostream> 2 #include<stdio.h> 3 #include<iostream> 4 #include<stdio.h> 5 #define N 1010 6 #define M 1010 7 #define K 6 8 using namespa

HDU 4965 Fast Matrix Calculation(矩阵高速幂)

题目大意:给你两个数字n和k,然后给你两个矩阵a是n*k的和b是k*n的,矩阵c = a*b,让你求c^(n*n). 直接求的话c是n*n的矩阵所以是1000*1000.会超时的啊. 能够转化一下:(a*b)^(n*n)=a*(b*a)^(n*n-1)*b.b*a能够得到一个k*k的矩阵,k非常小所以不会超时.高速幂一下就能够了啊. Fast Matrix Calculation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 13

HDU 4965 Fast Matrix Calculation 【矩阵】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4965 题目大意:给你一个N*K的矩阵A以及一个K*N的矩阵B (4 <= N <= 1000)以及 (2 <=K <= 6),然后接下来四步: 算一个新的矩阵C=A*B 算M=C^ (N*N) 对于M中的每个元素%6 将M中每个元素加起来,算出和. 也就是求出A*B * A*B * A*B * A*B * A*B *--* A*B   但是A*B形成的矩阵是N*N,而N大小有可能是10

HDU 4965 Fast Matrix Calculation(矩阵快速幂)

HDU 4965 Fast Matrix Calculation 题目链接 矩阵相乘为AxBxAxB...乘nn次,可以变成Ax(BxAxBxA...)xB,中间乘n n - 1次,这样中间的矩阵一个只有6x6,就可以用矩阵快速幂搞了 代码: #include <cstdio> #include <cstring> const int N = 1005; const int M = 10; int n, m; int A[N][M], B[M][N], C[M][M], CC[N]

HDU 4965 Fast Matrix Calculation(矩阵高速幂)

HDU 4965 Fast Matrix Calculation 题目链接 矩阵相乘为AxBxAxB...乘nn次.能够变成Ax(BxAxBxA...)xB,中间乘n n - 1次,这样中间的矩阵一个仅仅有6x6.就能够用矩阵高速幂搞了 代码: #include <cstdio> #include <cstring> const int N = 1005; const int M = 10; int n, m; int A[N][M], B[M][N], C[M][M], CC[N

hdu 4965 Fast Matrix Calculation(矩阵快速幂)2014多校训练第9场

Fast Matrix Calculation                                                                   Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description One day, Alice and Bob felt bored again, Bob knows Ali

hdu 4965 Fast Matrix Calculation

题目链接:hdu 4965,题目大意:给你一个 n*k 的矩阵 A 和一个 k*n 的矩阵 B,定义矩阵 C= A*B,然后矩阵 M= C^(n*n),矩阵中一切元素皆 mod 6,最后求出 M 中所有元素的和.题意很明确了,便赶紧敲了个矩阵快速幂的模板(因为编程的基本功不够还是调试了很久),然后提交后TLE了,改了下细节,加了各种特技,比如输入优化什么的,还是TLE,没办法,只好搜题解,看了别人的题解后才知道原来 A*B 已经是 n*n 的矩阵了,所以(A*B)n*n 的快速幂里的每个乘法都是