矩阵乘法
斐波那契数列
#include <iostream>
#include <cstdio>
#include <cstring>
#define ll long long
using namespace std;
const int mod=10000;
int read()
{
int x=0,f=0,c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return f?-x:x;
}
struct Martix
{
int x,y;
int a[3][3];
Martix(int tx,int ty){ x=tx; y=ty; memset(a,0,sizeof a);};
void Unit(){for(int i=1;i<=x;i++) a[i][i]=1;}
};
Martix operator *(const Martix &A,const Martix &B)
{
Martix tmp(A.x,B.y);
for(int i=1;i<=A.x;i++)
for(int j=1;j<=B.y;j++)
for(int k=1;k<=A.y;k++)
tmp.a[i][j]=( (ll)A.a[i][k]*B.a[k][j]+tmp.a[i][j] )%mod;
return tmp;
}
Martix ksm(Martix A,int b)
{
Martix ans(2,2); ans.Unit();
while(b)
{
if(b&1) ans=A*ans;
A=A*A;
b=b>>1;
}
return ans;
}
int n;
int main()
{
Martix C(2,2); C.a[1][1]=0; C.a[1][2]=C.a[2][1]=C.a[2][2]=1;
Martix A(1,2); A.a[1][1]=0; A.a[1][2]=1;
while( (n=read())!=-1)
{
Martix ans=ksm(C,n);
ans=A*ans;//不满足交换律
printf("%d\n",ans.a[1][1]);
}
return 0;
}
注意 矩阵乘法不满足交换律

浙公网安备 33010602011771号