描述

【题解】

用矩阵乘法加速递推

[0 1]

[1 1]

*

[f[n-1]]

[f[n-2]]

[f[n-1]]

[f[n]]

求A矩阵的n-2次幂然后再乘B矩阵。

结果矩阵中的第二行第一列就是f[n]的结果了

【代码】

  1. #include <cstdio>
  2. #include <cstring>
  3. #define ll long long
  4. using namespace std;
  5. const int N = 100;
  6. const long long MOD = 1e9+7;
  7. const int G = 2;
  8. struct abc{
  9. ll v[G+10][G+10];
  10. void print(){
  11. for (int i = 1;i <= G;i++)
  12. {
  13. for (int j = 1;j <= G;j++)
  14. printf("%I64d ",v[i][j]);
  15. puts("");
  16. }
  17. puts("");
  18. }
  19. void E(){
  20. memset(v,0,sizeof v);
  21. for (int i = 1;i <= G;i++) v[i][i]=1;
  22. }
  23. void O(){
  24. memset(v,0,sizeof v);
  25. }
  26. abc operator * (const abc b) const{
  27. abc temp;temp.O();
  28. for (int i = 1;i <= G;i++)
  29. for (int j = 1;j <= G;j++){
  30. ll sum = 0;
  31. for (int k = 1;k<= G;k++){
  32. sum=(sum+v[i][k]*b.v[k][j])%MOD;
  33. }
  34. temp.v[i][j] = sum;
  35. }
  36. return temp;
  37. }
  38. abc operator ^(int n)const{
  39. abc x;x.E();
  40. abc y;memcpy(y.v,v,sizeof(v));
  41. while (n>0){
  42. if (n&1) x=x*y;
  43. y = y*y;
  44. n/=2;
  45. }
  46. return x;
  47. }
  48. };
  49. abc a,b;
  50. int n;
  51. int main(){
  52. scanf("%d",&n);
  53. a.O();
  54. a.v[1][1] = 0;a.v[1][2] = 1;
  55. a.v[2][1] = 1;a.v[2][2] = 1;
  56. b.O();
  57. b.v[1][1] = 1;b.v[2][1] = 1;
  58. if (n<=2){
  59. printf("%d\n",1);
  60. }else{
  61. a = a^(n-2);
  62. a = a*b;
  63. printf("%I64d\n",a.v[2][1]);
  64. }
  65. return 0;
  66. }

【历年真题】斐波那契数列logn做法的更多相关文章

  1. NOIP模拟题 斐波那契数列

    题目大意 给定长度为$n$序列$A$,将它划分成尽可能少的若干部分,使得任意部分内两两之和均不为斐波那契数列中的某一项. 题解 不难发现$2\times 10^9$之内的斐波那契数不超过$50$个 先 ...

  2. 【校招面试 之 剑指offer】第10-1题 斐波那契数列

    递归以及非递归实现: #include<iostream> using namespace std; long long fun(long long n){ if(n == 0){ ret ...

  3. 1242 斐波那契数列的第N项

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

  4. 用PHP迭代器来实现一个斐波纳契数列(转)

    斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解 ...

  5. 用PHP迭代器来实现一个斐波纳契数列

    斐波纳契数列通常做法是用递归实现,当然还有其它的方法.这里现学现卖,用PHP的迭代器来实现一个斐波纳契数列,几乎没有什么难度,只是把类里的next()方法重写了一次.注释已经写到代码中,也是相当好理解 ...

  6. 【每天一题ACM】 斐波那契数列(Fibonacci sequence)的实现

    最近因为一些原因需要接触一些ACM的东西,想想写个blog当作笔记吧!同时也给有需要的人一些参考 话不多说,关于斐波那契数列(Fibonacci sequence)不了解的同学可以看看百度百科之类的, ...

  7. hdu 2044:一只小蜜蜂...(水题,斐波那契数列)

    一只小蜜蜂... Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepte ...

  8. 51 Nod 1242 斐波那契数列的第N项(矩阵快速幂模板题)

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

  9. 计蒜客 28319.Interesting Integers-类似斐波那契数列-递推思维题 (Benelux Algorithm Programming Contest 2014 Final ACM-ICPC Asia Training League 暑假第一阶段第二场 I)

    I. Interesting Integers 传送门 应该是叫思维题吧,反正敲一下脑壳才知道自己哪里写错了.要敢于暴力. 这个题的题意就是给你一个数,让你逆推出递推的最开始的两个数(假设一开始的两个 ...

随机推荐

  1. java笔试题大全之IO流常见选择题

    1.下面哪个流类属于面向字符的输入流()选择一项)A. BufferedWriterB. FileInputStreamC. ObjectInputStreamD. InputStreamReader ...

  2. 1、Python 基础类型 -- Number 数字类型

    一.Number

  3. 解决Addin开发不能断点调试的问题

    ArcMap或CAD在调试C#二次开发的插件的时候,在一些情况下不能正常进入到断点中,原因是debugger type不对应. eg. 右键单击Solution Explorer,选择Add-> ...

  4. python制作坦克对战

    创建子弹类 import pygame class Bullet(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__i ...

  5. Faster-RCNN论文精读

    State-of-the-art object detection networks depend on region proposal algorithms to hypothesize objec ...

  6. python判断文件的编码格式是否为UTF8 无BOM格式

    转自: https://www.cnblogs.com/ferraborghini/p/4951102.html https://www.cnblogs.com/Detector/p/8744992. ...

  7. delphi 设备函数GetDeviceCaps函数

    {说明:以下内容来源于网络,修改多处错误所得 2019.10.04 } GetDeviceCaps 函数功能:该函数检索指定设备的设备指定信息.该函数经常用在操作打印机等设备中.函数原型:int Ge ...

  8. Codeforces gym102222 C. Caesar Cipher 签到

    题意: 给定一对用凯撒密码加密的明文和密文,再给你一个密文,让你解密出明文,保证有唯一解. 题解: 对凯撒密码的已知明文攻击,签到题. #include<iostream> using n ...

  9. php开发面试题---php高级程序员需要掌握的一些知识

    php开发面试题---php高级程序员需要掌握的一些知识 一.总结 一句话总结: 还是需要多多接触架构师的知识,比如这里说的微服务,还有需要php服务端的知识来解决web端的不足,比如Swoole 1 ...

  10. QtConcurrent::run() 的使用

    QFuture<T>run(constClass *object,T(Class::*fn)(Param1,Param2,Param3,Param4,Param5)const,constA ...