• Fibonacci 矩阵乘法


    斐波那切数列.F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n>=2)

    每行输入一个数n和m(n <= 2*10^9 ,m < 10^4)

    每行输出F(n)%m.

    第 n 个数为:

    ┌          ┐  ^n  ┌  ┐

     |   0 1  |            0

     |   1 1  |            1

    └          ┘         └  ┘ 

    对应各元素位置:

    ┌                  ┐

     |   [0]   [1]   |

     |   [2]   [3]   |

    └                  ┘

    通过调用递归函数,计算乘积。时间复杂度:O(log2N)。

    代码
    #include<stdio.h>
    int m, a[4], b[4];
    void mult(int t)
    {
    b[
    0]=(a[0]*a[0]+a[1]*a[2])%m;
    b[
    1]=(a[0]*a[1]+a[1]*a[3])%m;
    b[
    2]=(a[2]*a[0]+a[3]*a[2])%m;
    b[
    3]=(a[2]*a[1]+a[3]*a[3])%m;
    a[
    0]=b[0];
    a[
    1]=b[1];
    a[
    2]=b[2];
    a[
    3]=b[3];
    if(t)//1,再乘以初始矩阵[0,1,1,1]
    {
    b[
    0]=a[1]%m;
    b[
    1]=(a[0]+a[1])%m;
    b[
    2]=a[3]%m;
    b[
    3]=(a[2]+a[3])%m;
    a[
    0]=b[0];
    a[
    1]=b[1];
    a[
    2]=b[2];
    a[
    3]=b[3];
    }
    }

    void fib(int n)
    {
    if(n == 1) return;
    fib(n
    >>1);//递归
    if(n&1) mult(1);//1,n为odd
    else mult(0);//0,n为even
    }

    int main()
    {
    int n;
    while(scanf("%d%d", &n, &m)!=EOF)
    {
    a[
    0]=0;
    a[
    1]=a[2]=a[3]=1;
    fib(n);
    printf(
    "%d\n",a[1]);
    }
    return 0;
    }
  • 相关阅读:
    4.Android开发笔记:Activity的生命周期、启动方式、最佳实践
    3.Android开发笔记:Activity 数据传递
    2.Android开发笔记:Activity
    1.《Android开发笔记》系列
    JS
    Mongodb 学习笔记简介
    Sql Server MySql 日期
    实现tomcat与IIS共用80端口
    学习Microsoft SQL Server 2008技术内幕:T-SQL语法基础--第4章
    学习Microsoft SQL Server 2008技术内幕:T-SQL语法基础
  • 原文地址:https://www.cnblogs.com/submarinex/p/1941240.html
Copyright © 2020-2023  润新知