POJ 3070 Fibonacci (矩陣快速冪基礎題)

題目鏈接:http://poj.org/problem?id=3070


創建如下矩陣求解遞推式Fn項的值:



代碼如下:

#include <cstdio>
#include <cstring>

const int mod = 10000;
const int matSize = 2;

struct Mat
{
    int val[matSize][matSize];
    void init() { memset(val,0,sizeof(val)); }
    void set1() {                             // 把矩陣置爲單位矩陣
        for(int i=0; i<matSize; i++)
            for(int j=0; j<matSize; j++)
                val[i][j] = (i == j);
    }
    friend Mat operator*(Mat a, Mat b)        // 重載*號進行矩陣乘法
    {
        Mat res;
        res.init();
        for(int i=0; i<matSize; i++) {
            for(int k=0; k<matSize; k++) {
                if(a.val[i][k]) {
                    for(int j=0; j<matSize; j++) {
                        res.val[i][j] += a.val[i][k]*b.val[k][j];
                        res.val[i][j] %= mod;
                    }
                }
            }
        }
        return res;
    }
    friend Mat operator^(Mat a, int x)         // 重載^號進行快速冪運算
    {
        Mat res;
        res.set1();
        while(x)
        {
            if(x & 1) res = res * a;
            a = a * a;
            x >>= 1;
        }
        return res;
    }
};

Mat A;
Mat B;

void init()
{
    A.val[0][0] = 1;
    A.val[0][1] = 1;
    A.val[1][0] = 1;
    A.val[1][1] = 0;
}

int main()
{
    int n;
    init();
    while(scanf("%d", &n), ~n) {
        B = A^n;
        printf("%d\n", B.val[0][1]);
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章