题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549;

题目是中文的很容易理解吧。可一开始我把题目看错了,这毛病哈哈。 一开始我看错题时,就用了一个快速幂来解,不用说肯定wa,看题目的通过率也不高,我想会不会有啥坑啊。然而我就是那大坑,哈哈。

不说了,直接说题吧,先讨论k=1,2,3;时的解。这应该会解吧,不多说了;

从第四项开始f(4)=a^1+b^2;f(5)=a^2+b^3;f(6)=a^3+b^5......; 看出来了吧,a上的指数成斐波那契数列,b的也成,而且a的指数是b的前一项;

那么就打表求斐波那契数列呗,不敢,范围太大,又爆内存又超时的。

f(n)=a^k(n-4)+b^k(n-3);其中n>=4;k(0)=1;k(1)=2;

用矩阵来求斐波那契数列的相邻两项有[k[n-2],k[n-1]]*[0 1]

[1 1]

上式等于[k[n-1],k[n]];

那么要求[k[n-4],k[n-3]]=[1,2]*[0 1]^(n-3)

[1 1]

这样就可以用矩阵快速幂来求k[n-4],k[n-3]了;

但光这样还不够,在矩阵快速幂过程中还得取模,不然会溢出。

由费马小定理在p为素数的情况下对任意的整数x都有x^p==x(mod p)

;如果x不能被p整除有x^(p-1)=1(mod p);由于a,b<1e9;所以不能被1e9+7整除, 求出了k[n],则a^k[n]%p=a^(k[n]%(p-1))%p;

证明如下: k[n]=m*(p-1)+d;那么a^k[n]%p=a^[(m*(p-1))+d]%p=(a^[m*(p-1)]%p*a^(d)%p)%p;

由费马小定理可知a^(m*(p-1))%p=1; 而d=k[n]%(p-1);得证;

所以矩阵快速幂时要对1e+6取模就行了; 当k(n)求出来是再进行快速幂运算就可以了,复杂度为2*log2(n); 注意要开longlong不然会溢出。

下面看代码:

  1. 1 #include<stdio.h>
  2. 2 #include<string.h>
  3. 3 #include<iostream>
  4. 4 #include<algorithm>
  5. 5 #include<stdlib.h>
  6. 6 #include<math.h>
  7. 7 const long long N=1e9+7;
  8. 8 const long long M=1e9+6;
  9. 9 typedef long long ll;
  10. 10 void kk(ll y);
  11. 11 ll pp(ll x,ll y);
  12. 12 ll b[2][2];
  13. 13 ll a[2][2];
  14. 14 using namespace std;
  15. 15 int main(void)
  16. 16 {
  17. 17 ll i,j,k,p,q,n,m;
  18. 18
  19. 19 while(scanf("%lld%lld%lld",&p,&q,&k)!=EOF)
  20. 20 {
  21. 21 if(k==0)
  22. 22 {
  23. 23 printf("%lld\n",p%N);
  24. 24
  25. 25 }
  26. 26 else if(k==1)
  27. 27 {
  28. 28 printf("%lld\n",q%N);
  29. 29
  30. 30 }
  31. 31 else if(k==2)
  32. 32 {
  33. 33 printf("%lld\n",(p%N*q%N)%N);
  34. 34 }
  35. 35 else
  36. 36 {
  37. 37 k=k-3;
  38. 38 kk(k);
  39. 39 ll p1=(b[0][0]%M+2*b[1][0]%M)%M;//求的k(n-4)
  40. 40 ll p2=(b[0][1]%M+2*b[1][1]%M)%M;//k[n-3]
  41. 41 ll x1=pp(p,p1);//a^k(n-4);
  42. 42 ll x2=pp(q,p2);//b^k(n-3);
  43. 43 ll dd=(x1*x2)%N;//d=(a^k(n-4)*b^k(n-3))%N;
  44. 44 printf("%lld\n",dd);
  45. 45
  46. 46 }
  47. 47
  48. 48 }
  49. 49
  50. 50 return 0;
  51. 51
  52. 52 }
  53. 53
  54. 54 ll pp(ll x,ll y)//快速幂
  55. 55 {
  56. 56 ll p=x;
  57. 57 ll q=1;
  58. 58
  59. 59 while(y)
  60. 60 {
  61. 61 if(y&1)
  62. 62 {
  63. 63 q=(q%N*p%N)%N;
  64. 64 }
  65. 65 p=(p%N*p%N)%N;
  66. 66
  67. 67 y=y/2;
  68. 68 }
  69. 69 return q;
  70. 70
  71. 71 }
  72. 72
  73. 73
  74. 74 void kk(ll y)//矩阵快速幂 形式和快速幂基本一样。
  75. 75 {
  76. 76 ll i,j,k;
  77. 77 ll x1,x2,x3,x4;
  78. 78 a[0][0]=0;//a为变换矩阵;
  79. 79 a[0][1]=1;
  80. 80 a[1][0]=1;
  81. 81 a[1][1]=1;
  82. 82 b[0][0]=1;//b为单位阵;
  83. 83 b[0][1]=0;
  84. 84 b[1][0]=0;
  85. 85 b[1][1]=1;
  86. 86
  87. 87 while(y)
  88. 88 {
  89. 89 if(y&1)
  90. 90 {
  91. 91 x1=((b[0][0]*a[0][0])%M+(b[0][1]*a[1][0])%M)%M;
  92. 92 x2=((b[0][0]*a[0][1])%M+(b[0][1]*a[1][1])%M)%M;
  93. 93 x3=((b[1][0]*a[0][0])%M+(b[1][1]*a[1][0])%M)%M;
  94. 94 x4=((b[1][0]*a[0][1])%M+(b[1][1]*a[1][1])%M)%M;
  95. 95 b[0][0]= x1;
  96. 96 b[0][1]=x2;
  97. 97 b[1][0]=x3;
  98. 98 b[1][1]=x4;
  99. 99 }
  100. 100 x1=((a[0][0]*a[0][0])%M+(a[0][1]*a[1][0])%M)%M;
  101. 101 x2=((a[0][0]*a[0][1])%M+(a[0][1]*a[1][1])%M)%M;
  102. 102 x3=((a[1][0]*a[0][0])%M+(a[1][1]*a[1][0])%M)%M;
  103. 103 x4=((a[1][0]*a[0][1])%M+(a[1][1]*a[1][1])%M)%M;
  104. 104 a[0][0]=x1;
  105. 105 a[0][1]=x2;
  106. 106 a[1][0]=x3;
  107. 107 a[1][1]=x4;
  108. 108 y/=2;
  109. 109
  110. 110 }
  111. 111
  112. 112
  113. 113
  114. 114
  115. 115 }

hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)的更多相关文章

  1. HDU 4549 M斐波那契数列(矩阵快速幂+费马小定理)

    M斐波那契数列 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submi ...

  2. [HDU 4549] M斐波那契数列

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  3. HDU 4549 M斐波那契数列(矩阵快速幂)

    题目链接:M斐波那契数列 题意:$F[0]=a,F[1]=b,F[n]=F[n-1]*F[n-2]$.给定$a,b,n$,求$F[n]$. 题解:暴力打表后发现$ F[n]=a^{fib(n-1)} ...

  4. hdu 4549 M斐波那契数列 矩阵快速幂+欧拉定理

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Problem ...

  5. POJ3070 斐波那契数列递推 矩阵快速幂模板题

    题目分析: 对于给出的n,求出斐波那契数列第n项的最后4为数,当n很大的时候,普通的递推会超时,这里介绍用矩阵快速幂解决当递推次数很大时的结果,这里矩阵已经给出,直接计算即可 #include< ...

  6. hdu 4549 M斐波那契数列(矩阵高速幂,高速幂降幂)

    http://acm.hdu.edu.cn/showproblem.php?pid=4549 f[0] = a^1*b^0%p,f[1] = a^0*b^1%p,f[2] = a^1*b^1%p... ...

  7. HDU 4549 M斐波那契数列(矩阵幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4549 题意:F[0]=a,F[1]=b,F[n]=F[n-1]*F[n-2]. 思路:手算一下可以发现 ...

  8. Tribonacci UVA - 12470 (简单的斐波拉契数列)(矩阵快速幂)

    题意:a1=0;a2=1;a3=2; a(n)=a(n-1)+a(n-2)+a(n-3);  求a(n) 思路:矩阵快速幂 #include<cstdio> #include<cst ...

  9. HDU 1316 (斐波那契数列,大数相加,大数比较大小)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1316 Recall the definition of the Fibonacci numbers: ...

随机推荐

  1. QQ空间技术架构之深刻揭秘

    QQ空间技术架构之深刻揭秘 来源: 腾讯大讲堂  发布时间: 2012-05-17 17:24  阅读: 7822 次  推荐: 4   [收藏]   QQ 空间作为腾讯海量互联网服务产品,经过近七年 ...

  2. MapReduce04 框架原理Shuffle

    目录 2 MapReduce工作流程 3 Shuffle机制(重点) 3.1 Shuffle机制 3.2 Partition分区 默认Partitioner分区 自定义Partitioner分区 自定 ...

  3. Windows系统安装MySQL详细教程和安装过程中问题汇总(命令安装),更新时间2021-12-8

    安装包下载 下载地址:https://dev.mysql.com/downloads/mysql/ 点击下载之后,可以选择注册Oracle账号,也可以跳过直接下载. 下载完成后,选择一个磁盘内放置并解 ...

  4. nit是虱子的卵

    如题.[牛津] (egg of a) louse or other parasitic insect 虱或其他寄生虫(的卵). 忘了在那个帖子里说nit: 虱子了. 为了凑字数,迄今为止六级/考研单词 ...

  5. abundant

    In ecology [生态学], local abundance is the relative representation of a species in a particular ecosys ...

  6. 转 Android中Activity的启动模式(LaunchMode)和使用场景

    转载请注明出处:http://blog.csdn.net/sinat_14849739/article/details/78072401本文出自Shawpoo的专栏我的简书:简书 一.为什么需要启动模 ...

  7. go channel 概述

    精髓 将资源读进内存-->共享内存,一个个进程/线程进行处理,这是常见模式.go channel 是一种直接在进程/线程之间传递资源的方式,即以通信来共享内存.这便是go的精髓. 扩展-一些名词 ...

  8. 运维笔记之yum,rpm,挂载,磁盘管理和raid详解

    yum 与 rpm centos6,7 主要有rpm和yum这两种包管理软件,两种包的管理各有用处,其中最主要区别是:  yum使用简单但需要联网,yum会去网上的yum包源去获取所需要的软件包.而r ...

  9. Ribbon详解

    转自Ribbon详解 简介 ​ Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装,可以让 ...

  10. maven管理本地jar包

    maven作为包管理工具,好处不必多说.但是有些情况,比如需要引入第三方包,如快递鸟,支付宝,微信等jar包(当然有可能直接提供maven依赖),如果直接下载到本地之后,怎么整合到自己的maven工程 ...