标签:des style blog http color os java io strong
题目大意:给你两个数字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很小所以不会超时,快速幂一下就可以了啊。
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
14 56
#include <algorithm> #include <iostream> #include <stdlib.h> #include <string.h> #include <iomanip> #include <stdio.h> #include <string> #include <queue> #include <cmath> #include <stack> #include <map> #include <set> #define eps 1e-10 ///#define M 1000100 ///#define LL __int64 #define LL long long ///#define INF 0x7ffffff #define INF 0x3f3f3f3f #define PI 3.1415926535898 #define zero(x) ((fabs(x)<eps)?0:x) using namespace std; const int maxn = 1010; #define mod 6 struct matrix { int f[6][6]; }; int A[maxn][maxn]; int B[maxn][maxn]; int C[maxn][maxn]; int D[maxn][maxn]; matrix mul(matrix a, matrix b, int n) { matrix c; memset(c.f, 0, sizeof(c.f)); for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { for(int k = 0; k < n; k++) c.f[i][j] += a.f[i][k]*b.f[k][j]; c.f[i][j] %= 6; } } return c; } matrix pow_mod(matrix a, int b, int n) { matrix s; memset(s.f, 0 , sizeof(s.f)); for(int i = 0; i < n; i++) s.f[i][i] = 1; while(b) { if(b&1) s = mul(s, a, n); a = mul(a, a, n); b >>= 1; } return s; } int main() { int n, k; while(cin >>n>>k) { if(!n && !k) break; 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 c; memset(c.f, 0, sizeof(c.f)); for(int i = 0; i < k; i++) { for(int j = 0; j < k; j++) { for(int jj = 0; jj < n; jj++) c.f[i][j] += B[i][jj]*A[jj][j]; c.f[i][j] %= mod; } } c = pow_mod(c, n*n-1, k); memset(C, 0, sizeof(C)); memset(D, 0, sizeof(D)); for(int i = 0; i < n; i++) { for(int j = 0; j < k; j++) { for(int jj = 0; jj < k; jj++) C[i][j] += A[i][jj]*c.f[jj][j]; C[i][j] %= mod; } } int ans = 0; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { for(int jj = 0; jj < k; jj++) D[i][j] += C[i][jj]*B[jj][j]; D[i][j] %= mod; ans += D[i][j]; } } cout<<ans<<endl; } return 0; }
HDU 4965 Fast Matrix Calculation(矩阵快速幂)
标签:des style blog http color os java io strong
原文地址:http://blog.csdn.net/xu12110501127/article/details/38865397