矩阵乘法

斐波那契数列

#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;
}

注意 矩阵乘法不满足交换律

posted @ 2022-01-09 16:13  __iostream  阅读(40)  评论(0)    收藏  举报