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; }