HDU多校賽第9場 HDU 4965Fast Matrix Calculation【矩陣運算+數學小知識】
阿新 • • 發佈:2017-06-03
stdin amp line you stream [] nbsp content ans
難度上。,,確實。。。不算難
問題是有個矩陣運算的優化
題目是說給個N*K的矩陣A給個K*N的矩陣B(1<=N<=1000 && 1=<K<=6),先把他們乘起來乘為C矩陣。然後算C^(N*N)
相當於
ABABABABABABAB...=(AB)^(N*N)
不如
A(BA)^(N*N-1)B
由於BA乘得K*K的矩陣,K是比較小的
#include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> using namespace std; int a[1111][1111]; int b[1111][1111]; int c[1111][1111]; int tmp[1111][1111]; int sum[1111][1111]; void TIMES(int K,int N,int M,int aa[][1111],int bb[][1111],int cc[][1111]){ memset(tmp,0,sizeof(tmp)); for(int i=1;i<=K;i++){ for(int j=1;j<=M;j++){ for(int k=1;k<=N;k++){ tmp[i][j]=(tmp[i][j]+aa[i][k]*bb[k][j]%6)%6; } } } for(int i=1;i<=K;i++) for(int j=1;j<=M;j++) cc[i][j]=tmp[i][j]%6; } void quick(int cc[][1111],int mi,int n){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(i==j) sum[i][j]=1; else sum[i][j]=0; while(mi){ if(mi&1) TIMES(n,n,n,cc,sum,sum); TIMES(n,n,n,cc,cc,cc); mi>>=1; } } int main(){ #ifndef ONLINE_JUDGE freopen("G:/in.txt","r",stdin); //freopen("G:/myout.txt","w",stdout); #endif int N,K; while(~scanf("%d%d",&N,&K)){ if(N==0 && K==0) return 0; for(int i=1;i<=N;i++){ for(int j=1;j<=K;j++){ scanf("%d",&a[i][j]); } } for(int i=1;i<=K;i++){ for(int j=1;j<=N;j++){ scanf("%d",&b[i][j]); } } TIMES(K,N,K,b,a,c); quick(c,N*N-1,K); TIMES(N,K,K,a,sum,sum); TIMES(N,K,N,sum,b,sum); int ans=0; for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) ans+=sum[i][j]; cout<<ans<<endl; } }
HDU多校賽第9場 HDU 4965Fast Matrix Calculation【矩陣運算+數學小知識】