POJ-3070 Fibonacci 快速矩阵幂

简单的快速矩阵幂:

Fn    1    1              Fn-1
   =                 *   
Fn-1   1    0      Fn-2

把前面的矩阵作快速幂就可以了。

代码如下:

#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MOD 10000
using namespace std;

struct Matrix // ['meitriks]
{
    int a[2][2];
    void New (int x, int y, int z, int w)
    {
        a[0][0] = x, a[0][1] = y;
        a[1][0] = z, a[1][1] = w;
    }
    Matrix operator * (Matrix p) {
        int sum = 0;
        Matrix ret;
        for (int i = 0; i < 2; ++i) {
            for (int k = 0; k < 2; ++k) {
                sum = 0;
                for (int j = 0; j < 2; ++j) {
                    sum += a[i][j] * p.a[j][k];
                }
                ret.a[i][k] = sum % MOD;
            }
        }
        return ret;
    }
    Matrix _pow(Matrix p, int b) 
    {
        Matrix ret;
        ret.New(1, 0, 0, 1);
        while (b) {
            if (b & 1) {
                ret = ret * p;
            }
            p = p * p;
            b >>= 1;
        }
        return ret; 
    }
    void print()
    {
        for (int i = 0; i < 2; ++i) {
            for (int j = 0; j < 2; ++j) {
                printf("%d ", a[i][j]);
            }
            puts("");
        }
    }
}M, P, ans;

int main()
{
    int N;
    P.New(1, 1, 1, 0);
    M.New(1, 0, 0, 0); // 保存这F0和F1
    while (scanf("%d", &N), N != -1) {
        ans = ans._pow(P, N); 
        ans = ans * M;
        printf("%d\n", ans.a[1][0]);
    }
    return 0;
}
posted @ 2012-07-25 10:05  沐阳  阅读(242)  评论(0编辑  收藏  举报