hdu4965-Fast Matrix Calculation【矩阵乘法】
生活随笔
收集整理的這篇文章主要介紹了
hdu4965-Fast Matrix Calculation【矩阵乘法】
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
正題
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4965
題目大意
給出矩陣A,BA,BA,B,求(AB)n(AB)^n(AB)n。然后對(duì)于每個(gè)元素%6\% 6%6后取和。
題目大意
我們發(fā)現(xiàn)如果直接讓AB?ABAB*ABAB?AB這樣的時(shí)間復(fù)雜度是n3n^3n3,顯然不可過。但是我們注意到kkk特別小,所以我們可以將(AB)n?n=A(BA)n?n?1B(AB)^{n*n}=A(BA)^{n*n-1}B(AB)n?n=A(BA)n?n?1B
即可,然后時(shí)間復(fù)雜度就變?yōu)榱?span id="ze8trgl8bvbq" class="katex--inline">O(n2k+k3logn)O(n^2k+k^3\ log\ n)O(n2k+k3?log?n)
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int Size=10; struct matrix{int a[Size][Size]; }c,ans,z; int n,K,answer,B,Ans[1100][1100],a[1100][1100],b[1100][1100]; matrix operator*(matrix &a,matrix &b) {memset(z.a,0,sizeof(z.a));for(int i=0;i<Size;i++)for(int j=0;j<Size;j++)for(int k=0;k<Size;k++)(z.a[i][j]+=a.a[i][k]*b.a[k][j])%=6;return z; } int main() {while(scanf("%d%d",&n,&K)){if(n==0||K==0) return 0;B=n*n-2;memset(a,0,sizeof(a));memset(b,0,sizeof(b));memset(c.a,0,sizeof(c.a));memset(Ans,0,sizeof(Ans));answer=0;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]);for(int i=0;i<K;i++)for(int j=0;j<K;j++)for(int k=0;k<n;k++)c.a[i][j]+=b[i][k]*a[k][j];ans=c;while(B){if(B&1) ans=ans*c;c=c*c;B>>=1;}for(int i=0;i<n;i++)for(int j=0;j<K;j++)for(int k=0;k<K;k++)Ans[i][j]+=a[i][k]*ans.a[k][j];for(int i=0;i<n;i++)for(int j=0;j<n;j++){int tmp=0;for(int k=0;k<K;k++)tmp+=Ans[i][k]*b[k][j];answer+=tmp%6;}printf("%d\n",answer);} }總結(jié)
以上是生活随笔為你收集整理的hdu4965-Fast Matrix Calculation【矩阵乘法】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信夜间模式如何调 有什么方法
- 下一篇: 月桂酸是什么 月桂酸简述