poj 3070 快速幂 矩阵相乘

矩阵相乘模板

#include <cstdio>
#include <cstring>
# define ld __int64
struct Matrix{
	ld a[2][2];
	void init()
	{
        a[0][0]=a[1][0]=a[0][1]=1;
		a[1][1]=0;
	}
};
Matrix matrix_mul(Matrix a,Matrix b)
{
	int i,j,k;
	Matrix ans;
	for(i=0;i<2;i++)
	{
		for(j=0;j<2;j++)
		{
			ans.a[i][j]=0;
			for(k=0;k<2;k++)
				ans.a[i][j]+=a.a[i][k]*b.a[k][j];
			ans.a[i][j]%=10000;
		}
	}
	return ans;
}
Matrix mult(Matrix a,ld b)
{
	Matrix ans;
	ans.init();
	while(b)
	{
		if(b&1)
		    ans=matrix_mul(ans,a);
		b>>=1;
		a=matrix_mul(a,a);
	}
	return ans;
}
int main()
{
	int n ;
    while(scanf("%I64d",&n),n!=-1)
	{
		Matrix ans,tmp;
        tmp.init();
		ans=mult(tmp,n);
		printf("%I64d\n",ans.a[1][1]%10000);
	}
	return 0;
}

  

posted @ 2011-11-25 13:11  Because Of You  Views(239)  Comments(0Edit  收藏  举报