ACM PKU Fibonacci http://poj.org/problem?id=3070 矩阵加速

这是一道矩阵加速的题,训练的时候有讲到这中省时的方法,所以拿这个题目来练手;
原理采用的是二分加速和矩阵乘法;
时间效率为logN,为计算斐波那契数列最快的方法,由于时间仓促,这里只做个简单的解题报告,有不懂的地方可以发表评论。
#include <iostream>
using namespace std;

struct tra
{
	long long ans[2][2];
};
	
void mul (tra & tempa, tra & tempb) 
{
		tra tmp;
		tmp.ans[0][0] =  tempa.ans[0][0] * tempb.ans [0][0] +  tempa. ans[0][1] * tempb.ans[1][0];
		tmp.ans[0][1] =  tempa.ans[0][0] * tempb.ans [0][1] +  tempa.ans[0][1] * tempb.ans [1][1];
		tmp.ans[1][0] =  tempa.ans[1][0] * tempb.ans [0][0] +  tempa.ans[1][1] * tempb.ans[1][0];
		tmp.ans[1][1] =  tempa.ans[1][0] * tempb.ans [0][1] +  tempa.ans[1][1] * tempb.ans [1][1];
		tempa.ans[0][0] = tmp.ans [0][0]%10000;
		tempa.ans[0][1] = tmp.ans[0][1]%10000;
		tempa.ans[1][0] = tmp.ans[1][0]%10000;
		tempa.ans[1][1] = tmp.ans[1][1]%10000;
}

int main()
{
	int n ;
	
	while (cin >> n && n != -1)
	{
		if( n == 0 ) 
		{
			cout << 0 << endl;
			continue;
		}

		tra a , b ;

		a.ans[0][0] = 1 ;  a.ans[0][1] = 0; a.ans[1][0] = 0; a.ans[1][1] = 1;
		b.ans[0][0] = 1 ; b.ans[0][1] = 1 ; b.ans[1][0] = 1;b.ans[1][1] = 0;

		while (n > 0)
		{
		if(n & 1)  mul(a ,b) ;
			n = n >> 1;
			mul(b,b);
		}
		cout<<a.ans[0][1]<<endl;
	}
	return 0;
}

posted on 2011-08-04 09:57  _Clarence  阅读(138)  评论(0编辑  收藏  举报

导航