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

题目链接;hdu 4965 Fast Matrix Calculation

题目大意:给定两个矩阵A,B,分别为N*K和K*N;

  1. 矩阵C = A*B
  2. 矩阵M=CN?N
  3. 将矩阵M中的所有元素取模6,得到新矩阵M‘
  4. 计算矩阵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>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn = 1005;
const int MOD = 6;
typedef int Mat[maxn][maxn];

int N, K;
Mat A, B, X, Y, tmp;

void put (Mat x, int r, int c) {
    for (int i = 0; i < K; i++) {
        for (int j = 0;  j < K; j++)
            printf("%d ", x[i][j]);
        printf("\n");
    }
}

void mul_mat (Mat ret, Mat a, Mat b, int r, int t, int c) {
    memset(tmp, 0, sizeof(tmp));

    for (int k = 0; k < t; k++) {
        for (int i = 0; i < r; i++)
            for (int j = 0; j < c; j++)
                tmp[i][j] = (tmp[i][j] + a[i][k] * b[k][j]) % MOD;
    }
    memcpy(ret, tmp, sizeof(tmp));
}

void pow_mat (Mat ret, Mat x, int n) {
    memset(Y, 0, sizeof(Y));
    for (int i = 0; i < K; i++)
        Y[i][i] = 1;

    while (n) {
        if (n&1)
            mul_mat(Y, Y, x, K, K, K);
        mul_mat(x, x, x, K, K, K);
        n >>= 1;
    }
    memcpy(ret, Y, sizeof(Y));
}

void init () {
    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]);
}

int main () {
    while (scanf("%d%d", &N, &K) == 2 && N + K) {
        init();

        mul_mat(X, B, A, K, N, K);

        pow_mat(X, X, N*N-1);

        mul_mat(X, A, X, N, K, K);
        mul_mat(X, X, B, N, K, N);

        int ans = 0;
        for (int i = 0; i < N; i++)
            for (int j = 0; j < N; j++)
                ans += X[i][j];
        printf("%d\n", ans);
    }
    return 0;
}

hdu 4965 Fast Matrix Calculation(矩阵快速幂),布布扣,bubuko.com

时间: 2024-12-22 22:59:08

hdu 4965 Fast Matrix Calculation(矩阵快速幂)的相关文章

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 矩阵乘法 乘法结合律

一种奇葩的写法,纪念一下当时的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>

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 题目链接 矩阵相乘为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 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 【矩阵】

题目链接: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(矩阵快速幂)

题意: 给你一个N*K的矩阵A和一个K*N的矩阵B,设矩阵C=AB,M=C^(N*N),矩阵Mmod6后,所有数的和是多少 思路: 刚开始我是直接计算的,开了一个1000*1000的矩阵,结果直接爆掉了 后来看了看题解,发现想的很巧妙 观察 M=ABABAB....AB,AB每次都是1000*1000,可是BA确是6*6的 那么 M=A(BABABA..BA)B,我们让BA进行矩阵快速幂就不会爆掉了 M=A(BA)^(N*N-1)B,最后计算一下就好了 代码: #include <iostrea