标签:sample write ring win define not space family scribe
题目大意:给你两个数字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(矩阵高速幂)
标签:sample write ring win define not space family scribe
原文地址:http://www.cnblogs.com/liguangsunls/p/6866416.html