矩陣乘法與斐波那契
阿新 • • 發佈:2018-12-24
矩陣乘法
A*B,只有當A的列數等於B的行數時才有意義,即A為
即
由定義可知,矩陣乘法滿足結合律,但不滿足交換律。
應用
矩陣乘法可以用來優化很多線性遞推式,下面以求斐波那契為例。
我們知道,
那麼,如何設計矩陣A呢?
顯然,A是一個2*2的矩陣,設 =[acbd]
剩下的事就交給快速冪了。
下面附上poj3070的程式碼:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 5
#define tt 10000
using namespace std;
inline char nc(){
static char buf[100000],*i=buf,*j=buf;
return i==j&&(j=(i=buf)+fread(buf,1,100000,stdin),i==j)?EOF:*i++;
}
inline int _read(){
char ch=nc();int sum=0,p=1;
while(ch!='-'&&!(ch>='0'&&ch<='9'))ch=nc();
if(ch=='-')p=-1,ch=nc();
while(ch>='0'&&ch<='9')sum=sum*10+ch-48,ch=nc();
return sum*p;
}
struct matrix{
int n,m,a[maxn][maxn];
matrix operator *(matrix&b){
matrix c;c.n=n;c.m=b.m;
for(int i=1;i<=c.n;i++)
for(int j=1;j<=c.m;j++){
c.a[i][j]=0;
for(int k=1;k<=m;k++) (c.a[i][j]+=a[i][k]*b.a[k][j])%=tt;
}
return c;
}
};
int n;
matrix G,ans;
matrix power(matrix x,int y){
if(y==1)return x;
matrix c=power(x,y>>1);
if(y&1)return c*c*x;
else return c*c;
}
int main(){
freopen("fib.in","r",stdin);
freopen("fib.out","w",stdout);
n=_read();
while(n!=-1){
G.n=G.m=2;G.a[1][1]=G.a[1][2]=G.a[2][1]=1;G.a[2][2]=0;
ans.n=2;ans.m=1;ans.a[1][1]=1;ans.a[2][1]=0;
if(n==0){
printf("0\n");n=_read();
continue;
}
if(n==1){
printf("1\n");n=_read();
continue;
}
G=power(G,n-1);
ans=G*ans;
printf("%d\n",ans.a[1][1]);
n=_read();
}
return 0;
}