zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Web API框架学习——消息管道(二)
    Web API框架学习——路由(一)
    【转】Lucene.NET详细使用与优化详解
    ASP.NET MVC 创建控制器类过程
    ASP.NET MVC创建视图过程
    ORM映射设计思想
    UWP--集合绑定数据
    UWP--MVVM简单计算器
    UWP--数据绑定的几种方式
    一个自动管理学生信息的控制台应用程序(C语言)Label:Water
  • 原文地址:https://www.cnblogs.com/submarinex/p/1941240.html
Copyright © 2011-2022 走看看