hdu4965---Fast Matrix Calculation(矩阵)

来源:互联网 发布:软件工程项目有哪些 编辑:程序博客网 时间:2024/05/21 21:56

题意:

给一个 NXK的矩阵 A  和 一个 KXN 的矩阵 B 求一个C=(A*B)^(N*N)

得出 矩阵C中每个元素mod6的和

K<=6 N<=1000 n*N<=1e6

思路:

(A*B)为一个NXN的矩阵

我们知道 矩阵乘法是 O(N^3)的复杂度 一次乘法 1e9就快要超时了

但是(B*A)是一个 KXK的矩阵 

显然算(B*A)的快速幂是一个正确的方向


(A*B)(N*N)=  ABABABABAB.......AB=A*(BABABA.......BA)*B=  A*(BA)^(n*n-1)*B

圆满的解决了

#include<bits/stdc++.h>using namespace std;#define N 6struct node{long long a[6][6];};node cheng(node a,node b,int k){node c;memset(c.a,0,sizeof(c.a));for(int i=0;i<k;i++){for(int j=0;j<k;j++)for(int t=0;t<k;t++)c.a[i][j]=(c.a[i][j]+(a.a[i][t]*b.a[t][j])%N)%N;}return c;}long long a[1000][6],b[6][1000],c[1000][6],d[1000][1000];int main(){int n,k,m;node x,y;; while(~scanf("%d%d",&n,&k),n+k)    {    m=n*n-1;          for(int i=0;i<n;i++)      for(int j=0;j<k;j++)      scanf("%lld",&(a[i][j]));      for(int i=0;i<k;i++)      for(int j=0;j<n;j++)      scanf("%lld",&(b[i][j]));      memset(x.a,0,sizeof(x.a));      memset(y.a,0,sizeof(y.a));      memset(c,0,sizeof(c));      memset(d,0,sizeof(d));      for(int i=0;i<k;i++)      x.a[i][i]=1;          for(int i=0;i<k;i++)      for(int j=0;j<k;j++)      for(int t=0;t<n;t++)      y.a[i][j]=(y.a[i][j]+(b[i][t]*a[t][j])%N)%N;            while(m)      {       if(m&1) x=cheng(x,y,k);      y=cheng(y,y,k);      m>>=1;      }            for(int i=0;i<n;i++)      for(int j=0;j<k;j++)      for(int t=0;t<k;t++)      c[i][j]=(c[i][j]+(a[i][t]*x.a[t][j])%N)%N;            for(int i=0;i<n;i++)      for(int j=0;j<n;j++)      for(int t=0;t<k;t++)      d[i][j]=(d[i][j]+(c[i][t]*b[t][j])%N)%N;            long long ans=0;      for(int i=0;i<n;i++)      for(int j=0;j<n;j++)      ans+=(d[i][j]%N+N)%N;            printf("%lld\n",ans);    }return 0;}



原创粉丝点击