矩阵快速幂

  定义矩阵A(m*n),B(p*q),A*B有意义当且仅当n=p。即A的列数等于B的行数。

  且C=A*B,C(m*q)。

  例如:

  进入正题,由于现在全国卷高考不考矩阵,也没多大了解。因为遇到了斐波那契这题...

  注意到: Fn+1=Fn+Fn-1

  我们会有:

  则:

  所以我们只需要想办法求矩阵A的幂,这时候我们当然想要用快速幂。


代码部分:

定义矩阵:

struct matrix{
    ll a[][];
};

(类比整数的快速幂)预处理:

[我们需要一类似于1的矩阵:]

『1 0 0

0 1 0

0 0 1』类似这种操作...

void init(){
        int i,j;
        memset(res.a,,sizeof res.a);
        ;i<=;i++) res.a[i][i]=;
        ][]=;
        ][]=;
        ][]=;
        ][]=;}

矩阵乘法:[就该题而言]

matrix mul(matrix p,matrix q){
        int i,j,k;
        matrix m;
        memset(m.a,,sizeof m.a);
        ;i<=;i++)
            ;j<=;j++)
                ;k<=;k++)
                    m.a[i][j]=(m.a[i][j]+p.a[i][k]*q.a[k][j])%Mod;
        return m;
}

快速幂:

void mfpow(ll p){
        init();
        while(p){
            ) res=mul(base,res);
            base=mul(base,base);
            p>>=;
        }
 }

全部的代码:(lowbee的难免会差一些,请大佬们见谅...)

 #include<iostream>
 #include<cstdio>
 #include<cstring>
 using namespace std;
 typedef long long ll ;
 inline ll read();
  ;
 struct matrix{
     ll a[][];
 };
 matrix res,base;
 ll ans;
 ll c[];
 ll n;
 namespace lys{
     void init(){
         int i,j;
         memset(res.a,,sizeof res.a);
         ;i<=;i++) res.a[i][i]=;
         ][]=;
         ][]=;
         ][]=;
         ][]=;
     }
     matrix mul(matrix p,matrix q){
         int i,j,k;
         matrix m;
         memset(m.a,,sizeof m.a);
         ;i<=;i++)
             ;j<=;j++)
                 ;k<=;k++)
                     m.a[i][j]=(m.a[i][j]+p.a[i][k]*q.a[k][j])%Mod;
         return m;
     }
     void mfpow(ll p){
         init();
         while(p){
             ) res=mul(base,res);
             base=mul(base,base);
             p>>=;
         }
     }
     int main(){
         int k;
         n=read();
         mfpow(n-);
         c[]=;
         c[]=;
         ;k<=;k++)
             ans=(ans+res.a[][k]*c[k])%Mod;
         cout<<ans<<endl;
         ;
     }
 }
 int main(){
     lys::main();
     ;
 }
 inline ll read(){
     ll k=,f=;
     char c=getchar();
     '){
         if(c=='-')
             f=-;
         c=getchar();
     }
     '){
         k=k*+c-';
         c=getchar();
     }
     return k*f;
 }

题目链接[luogu]:

https://www.luogu.org/problem/show?pid=1962

斐波那契数列第N项f(N)[矩阵快速幂]的更多相关文章

  1. HDU4549 M斐波那契数列 —— 斐波那契、费马小定理、矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-4549 M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Li ...

  2. 黑马入学基础测试(三)求斐波那契数列第n项,n<30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55

    .获得用户的输入 计算      3打印就行了.   这里用到了java.util.Scanner   具体API  我就觉得不常用.解决问题就ok了.注意的是:他们按照流体的方式读取.而不是刻意反复 ...

  3. 斐波那契数列第n项的值及前n项之和

    <script>// 算法题 // 题1:斐波那契数列:1.1.2.3.5.8.13.21...// // 一.斐波那契数列第n项的值 // // 方法一//递归的写法function a ...

  4. python练习题-打印斐波拉契数列前n项

    打印斐波拉契数列前n项 #encoding=utf-8 def fibs(num):    result =[0,1]    for i in range(num-2):        result. ...

  5. 经典算法详解(1)斐波那契数列的n项

    斐波那契数列是一个常识性的知识,它指的是这样的一个数列,它的第一项是1,第二项是1,后面每一项都是它前面两项的和,如:1,1,2,3,5,8,13,21,34,55,89,144,233…… 说明:由 ...

  6. 用JS,求斐波那契数列第n项的值

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  7. 00.斐波那契数列第n项

    # 斐波那契数列第n项 # 1 1 2 3 5 8 def fib(n): if n <= 2: return 1 else: return fib(n-2)+fib(n-1) def fib2 ...

  8. C#求斐波那契数列第30项的值(递归和非递归)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. 51nod--1242 斐波那契数列第N项 (矩阵乘法优化)

    题目: 1242 斐波那契数列的第N项 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 斐波那契数列的定义如下: F(0) = 0 F(1) = 1 F(n) ...

随机推荐

  1. jenkins 每个月1号到7号 一天执行一次

    在线Crontab表达式执行时间验证 / crontab执行时间计算 - aTool在线工具验证 http://www.atool.org/crontab.php 1.Build periodic a ...

  2. linux命令详解(一)netstat

    今天在使用linux的时候,要查看端口号,但是不知道要使用哪一个命令所以就学习了一下,原来是使用netstat,接下来给大家一起来学习. 一.netstat介绍 1.1.简介 Netstat 命令用于 ...

  3. 自己为什么注册博客(csdn讲师:Array)

    记录生活,记录技术,记录青春. 势若在己,则人力可以至:势若在人,则忧心亦无益. 倘若势不在己,该怎么办? 天下之势,本如流水.若流于他处,则处心积虑,断流开源,独占大势. 这是一个最好的时代,也是一 ...

  4. SVG图案

    前面的话 给SVG元素应用填充和描边,除了使用纯色和渐变外,还可以使用图案.本文将详细介绍SVG图案 概述 <pattern>可以实现重复的效果,在canvas中被翻译为模式,而在SVG中 ...

  5. js变量以及其作用域详解

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp73   一.变量的类型  Javascript和Java.C这些语言不同 ...

  6. Project 2:传奇汉诺塔

    汉诺塔简介:汉诺塔问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在 ...

  7. Swiper 滑动

    1.http://www.swiper.com.cn/download/  下载Swiper.JS  Swiper.CSS 2.引入项目,添加html <div class="cont ...

  8. java1.8新特性

    转自:http://www.oschina.NET/translate/everything-about-Java-8 建议去看原文,此处转载只是为了记录. 这篇文章是对Java8中即将到来的改进做一 ...

  9. oop 第三次作业 文件读写

    oop第三次作业 GitHub 对于迟交我感到很抱歉 031602510 体会 这次的用到了之前的文件读写,传参 定义函数有返回值,使代码更加简洁.面向对象的程序设计,在面对函数多元的情况下,编程更加 ...

  10. SNS团队第一次站立会议(2017.04.22)

    一.当天站立式会议照片 本次会议主要内容:进一步明确了团队中各个成员的定位,说明了下一步团队工作的方向 二.每个人的工作 成员 昨天已完成的工作 今天计划完成的工作 罗于婕 系统架构设计及项目数据库设 ...