poj3070 Fibonacci(矩阵快速幂,斐波拉契)

Fibonacci(矩阵快速幂,斐波拉契)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int mod=10000;
struct Matrix
{
	int mtx[2][2];
	Matrix(){
		memset(mtx,0,sizeof(mtx));
	}
};
Matrix multiply(Matrix a,Matrix b){
	Matrix c;
	for(int i=0;i<2;++i){
		for(int j=0;j<2;++j){
			for(int k=0;k<2;++k){
				c.mtx[i][j]+=a.mtx[i][k]*b.mtx[k][j];
			}
			c.mtx[i][j]%=mod;
		}
	}
	return c;
}
Matrix quickpow(Matrix a,int n){
	Matrix b;
	b.mtx[0][0]=b.mtx[1][1]=1;
	b.mtx[0][1]=b.mtx[1][0]=0;//E
	while(n){
		if(n&1) b=multiply(a,b);
		a=multiply(a,a);
		n/=2;
	}
	return b;
}
int main()
{
	int n;
	while(scanf("%d",&n)&&n!=-1){
		Matrix a,res;
		a.mtx[0][0]=1;a.mtx[0][1]=1;
		a.mtx[1][0]=1;a.mtx[1][1]=0;
		res=quickpow(a,n);
		printf("%d\n",res.mtx[0][1]);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/gl486546/article/details/79845468