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;
}
浙公网安备 33010602011771号