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

题意:f[n] = 2*f[n-2] + f[n-1] + n^4

思路:对于递推题而言,如果递推n次很大,则考虑矩阵快速幂的方式推出递推式,计算出累乘的矩阵

本题递推式:本题的递推式子虽然已经给出,但是由于n^4的关系,直接是无法使用这个f[n] = 2*f[n-2] + f[n-1] + n^4递推完成矩阵的推导的,而是可以先处理一下,如下:

f[n] = 2*f[n-2] + f[n-1] + n^4

f[n+1] = 2*f[n-1] + f[n] + n^4 + 4*n^3 + 6*n^2 + 4*n + 1

f[n+2] = 2*f[n] + f[n+1] + (n+1)^4 + 4*(n+1)^3 + 6*(n+1)^2 + 4*(n+1)+ 1

此时,我们发现从n+1项开始包括n+1项,都是由7个部分组成的多项式,则我们可以利用n+1项和n+2项的多项式进行矩阵快速幂的递推矩阵的推导,由于矩阵乘法的性质,对于一个1X7的矩阵A,要求相乘另一个矩阵B之后,还是一个1X7的矩阵,则矩阵B的规模必须是7X7,下面是推导, 对于黄色的一行乘绿色一列,得到橙色的一个数

完成矩阵的递推之后,就很简单了,用矩阵的快速幂计算即可,需要注意的是对于n>=3,我们才需要进行矩阵相乘的运算,而初始的时候,我们需要计算出黄色矩阵代表的部分,本题就是将n==2代入,算出初始黄色矩阵为[a, b, 16, 8, 4, 2, 1]

代码:

  1. #include<iostream>
  2. #include<stdio.h>
  3. using namespace std;
  4.  
  5. const long long mod = ;
  6. struct mat{
  7. long long m[][];
  8. };
  9.  
  10. mat operator * (mat a, mat b){ //重载乘号,同时将数据mod10000
  11. mat ret;
  12. for(int i = ; i < ; i++){
  13. for(int j = ; j < ; j++){
  14. long long temp = ;
  15. for(int k = ; k < ; k++){
  16. temp += a.m[i][k] * b.m[k][j];
  17. temp %= mod;
  18. }
  19. ret.m[i][j] = temp;
  20. }
  21. }
  22. return ret;
  23. }
  24.  
  25. mat pow_mat(int f1, int f2, mat a, int n){ //矩阵快速幂和快速幂相同(广义快速幂的思想)
  26. mat res;
  27. res.m[][] = f1,res.m[][] = f2,res.m[][] = ,res.m[][] = ,res.m[][] = ,res.m[][] = ,res.m[][] = ;
  28. while(n){
  29. if(n&) res = res * a;
  30. a = a*a;
  31. n >>= ;
  32. }
  33. return res;
  34. }
  35.  
  36. int main(){
  37. int t;
  38. scanf("%d", &t);
  39. while(t--){
  40. int n, a, b;
  41. scanf("%d%d%d", &n, &a, &b);
  42. if(n == ) printf("%d\n", a);
  43. else if(n == ) printf("%d\n", b);
  44. else{
  45. mat x;
  46. x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ;
  47. x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ;
  48. x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ;
  49. x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ;
  50. x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ;
  51. x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ;
  52. x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ,x.m[][] = ;
  53. mat ans = pow_mat(a, b, x, n-);
  54. printf("%d\n", ans.m[][]);
  55. }
  56. }
  57. return ;
  58. }

HDU5950 矩阵快速幂(巧妙的递推)的更多相关文章

  1. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

  2. HDU 3802 矩阵快速幂 化简递推式子 加一点点二次剩余知识

    求$G(a,b,n,p) = (a^{\frac {p-1}{2}}+1)(b^{\frac{p-1}{2}}+1)[(\sqrt{a} + \sqrt{b})^{2F_n} + (\sqrt{a} ...

  3. HDU 5863 cjj's string game ( 16年多校10 G 题、矩阵快速幂优化线性递推DP )

    题目链接 题意 : 有种不同的字符,每种字符有无限个,要求用这k种字符构造两个长度为n的字符串a和b,使得a串和b串的最长公共部分长度恰为m,问方案数 分析 : 直觉是DP 不过当时看到 n 很大.但 ...

  4. 矩阵快速幂(queue递推)

    http://acm.hdu.edu.cn/showproblem.php?pid=2604 Queuing Time Limit: 10000/5000 MS (Java/Others)    Me ...

  5. 【矩阵乘法】【快速幂】【递推】斐波那契数列&&矩乘优化递推模板

    题目大意: F[0]=0 F[1]=1 F[n+2]=F[n+1]+F[n] 求F[n] mod 104. F[n+2] F[n+1] = 1 1 1 0 * F[n+1] F[n] 记这个矩阵为A, ...

  6. [HDOJ2604]Queuing(递推,矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604 递推式是百度的,主要是练习一下如何使用矩阵快速幂优化. 递推式:f(n)=f(n-1)+f(n- ...

  7. 2017中国大学生程序设计竞赛 - 女生专场 Happy Necklace(递推+矩阵快速幂)

    Happy Necklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

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

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

  9. 2018 焦作网络赛 L Poor God Water ( AC自动机构造矩阵、BM求线性递推、手动构造矩阵、矩阵快速幂 )

    题目链接 题意 : 实际上可以转化一下题意 要求求出用三个不同元素的字符集例如 { 'A' .'B' .'C' } 构造出长度为 n 且不包含 AAA.BBB CCC.ACB BCA.CAC CBC ...

随机推荐

  1. FastEarth

    1        概述 FastEarth(后文简称FE)是自主研发的跨平台三维地理信息可视化协作平台,内置完全自主研发的XDR渲染引擎,无缝对接主流地理信息平台数据.建筑BIM.工厂PIM以及多种三 ...

  2. Java 学习笔记之 线程sleep方法

    线程sleep方法: 单主线程使用sleep: Main线程差了2000毫秒. public class MainSleepThread extends Thread{ @Override publi ...

  3. SpringBootSecurity学习(21)前后端分离版之OAuth2.0非对称加密

    JWT转换器 前面的例子中,都是在授权服务配置类中配置了一个很简单的jwt转换器,如下: 可以看到我们只用setSigningKey方法配置了一个秘钥,这里使用的是简单的对称加密的方式来加密jwt内容 ...

  4. Angular: If ngModel is used within a form tag, either the name attribute must be set or the form control must be defined as ‘standalone’ in ngModelOptions.

    在Angular中,动态生成的Html控件,如果没有name属性并且在ts中要操作Model的内容.就会引发如题的错误. 解决方案两个: 加上name的属性 设置ngModelOptions   [n ...

  5. 创建一个 Laravel 项目

    创建一个 Laravel 项目,首先需要安装 Composer ,如果没有安装的参考 https://docs.phpcomposer.com/00-intro.html 一.安装 Laravel 安 ...

  6. 超详细的FreeRTOS移植全教程——基于srm32

    ### 准备 在移植之前,我们首先要获取到FreeRTOS的官方的源码包.这里我们提供两个下载链接: > 一个是官网:http://www.freertos.org/ > 另外一个是代码托 ...

  7. Adobe PS常用快捷键

    ps使用快捷键 新建图层    Ctrl+Shift+N 取消选择区  Ctrl + D 新建标题    Ctrl + N 图片放大 Alt+鼠标滑动 图片位置拖动    空格 + 鼠标拖动 移动图层 ...

  8. Java集合总结—再也不怕面试问到集合了

    Java集合总结 1.常见的集合 Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List接口 Map接口的实现类主要有:HashMap ...

  9. Road Construction

    King Mercer is the king of ACM kingdom. There are one capital and some cities in his kingdom. Amazin ...

  10. wildfly(JBoss AS)应用服务器快速入门

    什么是wildfly JBoss AS 从8版本起名为wildfly.Wildfly是一个开源的基于JavaEE的轻量级应用服务器.可以在任何商业应用中免费使用. WildFly是一个灵活的.轻量的. ...