这道题目可以先转化:

令f(1) = 5+2√6

f(2) = f(1)*(5+2√6)

...

f(n) = f(n-1)*(5+2√6)

f(n) = f(n-1)*(10-(5-2√6)) = 10*f(n-1)-(5-2√6)f(n-1) = 10*f(n-1) - 10/(5+2√6) f(n-1) = 10*f(n-1) - 10/(5+2√6) * (5+2√6)f(n-2)

= 10*f(n-1) - f(n-2)

那么就可以写成矩阵相乘的形式了

(f(n) , f(n-1)) = (f(n-1) , f(n-2)) (10 , 1

                   -1 , 0)

但这里2^x+1还是很大,这里就用到广义斐波那契数列找循环节的思想

循环节长度 = (mod-1)*(mod+1)

具体证明可以参考这里:   广义斐波那契数列

那么只要求出对模循环节后的长度进行幂运算就行了

但这里f(i)都是带根号的小数 , 这里就选择用近似的整数代替

5+2√6 = 9.89...

f(0) = (5+2√6)^0 = 1

f(1) = (5+2√6)^1 = 5+2√6

/*囧 想了半天我还是不知道为什么f(0)用2代替 , f(1)用10代替就一定保证之后取到的都是上顶*/

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define N 100010
  4. #define ll long long
  5. int n,q;
  6. ll MOD;
  7. struct Matrix{
  8. int m[][];
  9. void init(){m[][]=m[][]=;m[][]=m[][]=;}
  10. Matrix operator*(const Matrix &p) const{
  11. Matrix ret;
  12. for(int i= ; i< ; i++)
  13. for(int j= ; j< ; j++){
  14. ret.m[i][j]=;
  15. for(int k= ; k< ; k++){
  16. ret.m[i][j] = (ret.m[i][j]+((ll)m[i][k]*p.m[k][j])%MOD)%MOD;
  17. }
  18. }
  19. return ret;
  20. }
  21. };
  22.  
  23. int qpow(int b)
  24. {
  25. ll ret= , a=;
  26. while(b){
  27. if(b&) ret = ret*a%MOD;
  28. a = a*a%MOD;
  29. b>>=;
  30. }
  31. return ret;
  32. }
  33.  
  34. Matrix qpow(Matrix a , int b)
  35. {
  36. Matrix ret;
  37. ret.init();
  38. while(b){
  39. if(b&) ret = ret*a;
  40. a = a*a;
  41. b>>=;
  42. }
  43. return ret;
  44. }
  45.  
  46. int main()
  47. {
  48. // freopen("a.in" , "r" , stdin);
  49. int T , cas=;
  50. scanf("%d" , &T);
  51. while(T--)
  52. {
  53. scanf("%d%d" , &n , &q);
  54. MOD = (q-)*(q+);
  55. n = qpow(n);
  56. MOD = q;
  57. Matrix a;
  58. a.m[][]= , a.m[][]=- , a.m[][]= , a.m[][]=;
  59. a = qpow(a , n);
  60. ll val = (ll)*a.m[][]+(ll)*a.m[][];
  61. val = ((val%MOD)+MOD)%MOD;
  62. printf("Case #%d: %I64d\n" , ++cas , (val+MOD-)%MOD);
  63. }
  64. return ;
  65. }

HDU 5451 广义斐波那契数列的更多相关文章

  1. 洛谷P1962 斐波那契数列 || P1349 广义斐波那契数列[矩阵乘法]

    P1962 斐波那契数列 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数 ...

  2. 矩阵乘法快速幂 codevs 1574 广义斐波那契数列

    codevs 1574 广义斐波那契数列  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond   题目描述 Description 广义的斐波那契数列是指形如 ...

  3. Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)

    Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...

  4. P1349 广义斐波那契数列(矩阵加速)

    P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如an=pan-1+qan-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an ...

  5. 洛谷P1349 广义斐波那契数列(矩阵快速幂)

    P1349 广义斐波那契数列 https://www.luogu.org/problemnew/show/P1349 题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定 ...

  6. 洛谷——P1349 广义斐波那契数列(矩阵加速)

    P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如$an=p\times a_{n-1}+q\times a_{n-2}$?的数列.今给定数列的两系数$p$和$q$,以及数列的最前两项 ...

  7. codevs1574广义斐波那契数列

    1574 广义斐波那契数列  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond     题目描述 Description 广义的斐波那契数列是指形如an=p* ...

  8. 「Luogu 1349」广义斐波那契数列

    更好的阅读体验 Portal Portal1: Luogu Description 广义的斐波那契数列是指形如\(an=p \times a_{n-1}+q \times a_{n-2}\)的数列.今 ...

  9. P1349 广义斐波那契数列(矩阵乘法)

    题目 P1349 广义斐波那契数列 解析 把普通的矩阵乘法求斐波那契数列改一改,随便一推就出来了 \[\begin{bmatrix}f_2\\f_1 \end{bmatrix}\begin{bmatr ...

随机推荐

  1. 【服务器防护】iptables 配置详解(非常棒的案例)

    一. iptables 基本命令使用举例 链的基本操作 1.清除所有的规则.1)清除预设表filter中所有规则链中的规则.# iptables -F2)清除预设表filter中使用者自定链中的规则. ...

  2. jquery中html(), text(),val()区别(zhuan)

    https://zhidao.baidu.com/question/307317838.html http://www.cnblogs.com/aqbyygyyga/archive/2011/11/0 ...

  3. VirtualBox的网络配置,Host Only+NAT方式 (zhuan)

    http://blog.csdn.net/xinghun_4/article/details/7969894 ***************************************** 其实网 ...

  4. MM--发票校验 及基于采购订单的MIRO发票校验过程(

    一.介绍发票校验是物料管理(MM)系统的一部分.它提供物料管理部分和财务会计, 成本控制和资产管理部分的连接.物料管理模块的发票校验为以下目的服务:它完成物料采购的全过程 - 物料采购从采购申请开始, ...

  5. 基于websocket的jsp与java进行交互

    环境:jdk.18   tomcat-7.0.70 把tomcat中的 两个jir包复制到 注意:最后部署的时候要删除掉这两个jar包 tomcate中已经有了 ebSocket对象的创建和服务器连接 ...

  6. 核心Javascript学习

    1. 引言: 1.1. 网页三要素: l HTML(内容) l CSS(外观) l Javascript(行为) 1.2.  OOP的相关概念 1). 对象,方法和属性 l 对象就是指"事物 ...

  7. linux服务器挂载第二块磁盘图文解说

    文章来源:http://www.cndns.com/help/help_con.aspx?hid=394 Linux磁盘挂载是比较常见的管理操作之一.我司橙云预装的linux系统有2块盘,一块为系统盘 ...

  8. MySQL学习笔记_1_MySQL数据库管理系统概述

    1. MySQL架构 C/S: client / server架构 MySQL DBMS(Data Bank Management System): 数据库管理系统 客户端 <---> 服 ...

  9. VS2012外接程序VMDebugger未能加载或导致了异常

    转http://blog.csdn.net/maryhuan/article/details/42676915 故障现象:打开Visual Studio 2010后弹出错误框,外接程序VMDebugg ...

  10. PHP + Memcache 实现多服务器session共享

    很多时候一个完整的系统可能运行在多个服务器上,如果这多个服务器之间需要共享session的话,那么php默认的files保存session的方式就无能为力了.这时我们可以考虑使用memcache 来接 ...