1. 程式人生 > >51Nod 1242:斐波那契數列的第N項

51Nod 1242:斐波那契數列的第N項

N比較大,用矩陣快速冪解決。

與POJ 3070題目一樣。

AC程式碼:

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>

using namespace std;

typedef long long LL;
const int N = 5;
LL temp[N][N];
LL res[N][N];
const int mod = 1000000009;
void Mul(LL a[][N],LL b[][N])
{
    memset(temp,0,sizeof(temp));
    for(int i = 0; i < 2; i++)  ///i行
        for(int j = 0; j < 2; j++)  ///j列
            for(int k = 0; k < 2; k++)
                temp[i][j] = (temp[i][j]+(a[i][k]*b[k][j])%mod)%mod;
    for(int i = 0; i < 2; i++)
        for(int j = 0; j < 2; j++)
            a[i][j] = temp[i][j];
}
void Solve(LL a[][N],LL n)  ///n是求的冪次
{
    memset(res,0,sizeof(res));
    for(int i = 0; i < 2; i++)
        res[i][i] = 1;
    while(n)
    {
        if(n&1)
            Mul(res,a);
        Mul(a,a);
        n>>=1;
    }
}
int main()
{
    LL T;
    while(~scanf("%lld",&T))
    {
        LL a[N][N];
        a[0][0] = 1;
        a[0][1] = 1;
        a[1][0] = 1;
        a[1][1] = 0;
        if(T == 0 || T == 1) printf("%lld\n",T);
        else
        {
            Solve(a,T);
            printf("%lld\n",res[0][1]);
        }
    }
    return 0;
}