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;

}

  

你可能感兴趣的:(poj)