您的位置:首页 > 其它

1242 斐波那契数列的第N项 运用矩阵快速幂来求解斐波那契数列问题

2017-11-05 20:26 369 查看
斐波那契数列的定义如下:

F(0) = 0
F(1) = 1
F(n) = F(n - 1) + F(n - 2) (n >= 2)

(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...)
给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可。

Input
输入1个数n(1 <= n <= 10^18)。


Output

输出F(n) % 1000000009的结果。

用普通的循环会超时的。要用矩阵快速幂

#include <cstdio>

#include <cstring>

#define MOD  1000000009

struct juzhen

{

    long long aa[2][2];

};

juzhen chengfa(juzhen &a, juzhen &b)

{

    juzhen c;

    memset(c.aa,0,sizeof(c.aa));

    for (int i = 0; i < 2; i++)

        for (int j = 0; j < 2; j++)

        {

            for (int k = 0; k < 2; k++)

            {

                c.aa[i][j] = (c.aa[i][j] + a.aa[i][k] * b.aa[k][j]) % MOD;

            }

        }

    return c;

}

juzhen pow(juzhen a, long long n)

{

    juzhen ans;

    for (int i = 0; i < 2; i++)

        for (int j = 0; j < 2; j++)

            if (i == j)

                ans.aa[i][j] = 1;

            else

                ans.aa[i][j] = 0;

    while (n)

    {

        if (n & 1)

            ans = chengfa(ans, a);

        a = chengfa(a, a);

        n /= 2;

    }

    return ans;

}

int main()

{

    long long n;

    juzhen a, b;

    scanf("%lld", &n);

    a.aa[0][0] = a.aa[0][1] = a.aa[1][0] = 1;

    a.aa[1][1] = 0;

    b = pow(a, n);

    printf("%lld\n", b.aa[0][1] % MOD);

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: