题意:
      给你n个人,排成一个长度是n的队伍,人只有两类f,m,问可以有多少种排法使度列中不出现fff,fmf这样的子串。

思路:
      一开始暴力,结果超时了,其实这个题目要是能找到类似于斐波那契那样的公式,就可以瞬间用矩阵乘法+快速幂秒掉大数据,现在我们来找公式,我们现在来讨论当前队列的最后一个字母,如果是m那么之前的所有+m都不会冲突,所以有f(n-1)个,如果是f呢?,这个时候我们要考虑不可以出现fff,fmf这样的序列,那么新形成的后缀也就只有mmf,mff可以满足了,mmf前面是什么都可以满足,所以f(n - 3),而mff还得往前找,只有mmff前面是什么都可以,这时是f(n
- 4),所以最终 f(n) = f(n - 1) + f(n - 3) + f(n - 4),接下来就构造矩阵,矩阵的构造也很简单,但是构造的时候别忘了,矩阵没有交换律的。

f(x)f(x+1)f(x+2)f(x+3)  *  [ 0 0 0 1 ] =  f(x+1)f(x+2)f(x+3)f(x+4)        

                                      [ 1 0 0 1 ]

                                      [ 0 1 0 0 ]

                                      [ 0 0 1 1 ]

构造完矩阵就可以用矩阵快速幂吊打这道题了。


  1. #include<stdio.h>
  2. #include<string.h>

  3. int MOD;
  4. typedef struct
  5. {
  6. int mat[5][5];
  7. }A;
  8.  
  9. A mat_mat(A a ,A b)
  10. {
  11. A c;
  12. memset(c.mat ,0 ,sizeof(c.mat));
  13. for(int k = 1 ;k <= 4 ;k ++)
  14. for(int i = 1 ;i <= 4 ;i ++)
  15. if(a.mat[i][k])
  16. for(int j = 1 ;j <= 4 ;j ++)
  17. c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD;
  18. return c;
  19. }
  20.  
  21. A quick_mat(A a ,int b)
  22. {
  23. A c;
  24. memset(c.mat ,0 ,sizeof(c.mat));
  25. for(int i = 1 ;i <= 4 ;i ++)
  26. c.mat[i][i] = 1;
  27. while(b)
  28. {
  29. if(b & 1) c = mat_mat(c ,a);
  30. a = mat_mat(a ,a);
  31. b >>= 1;
  32. }
  33. return c;
  34. }
  35. int main ()
  36. {
  37. A a ,b;
  38. int n ,num[5];
  39. memset(a.mat ,0 ,sizeof(a.mat));
  40. a.mat[1][4] = a.mat[2][1] = a.mat[2][4] = 1;
  41. a.mat[3][2] = a.mat[4][3] = a.mat[4][4] = 1;
  42. num[0] = 1 ,num[1] = 2 ,num[2] = 4 ,num[3] = 6;
  43. while(~scanf("%d %d" ,&n ,&MOD))
  44. {
  45. if(n <= 3)
  46. {
  47. printf("%d\n" ,num[n] % MOD);
  48. continue;
  49. }
  50. b = quick_mat(a ,n - 3);
  51. int ans = num[0] * b.mat[1][4] + num[1] * b.mat[2][4] + num[2] * b.mat[3][4] + num[3] * b.mat[4][4];
  52. printf("%d\n" ,ans % MOD);
  53. }
  54. return 0;
  55. }

hdu2604 矩阵快速幂的更多相关文章

  1. hdu2604(递推,矩阵快速幂)

    题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...

  2. 矩阵快速幂小结-Hdu2604

    矩阵快速幂可以想象为线性代数的矩阵相乘,主要是运用于高效的计算矩阵高次方. 将矩阵两两分组,若要求a^n,即知道a^(n/2)次方即可,矩阵快速幂便是运用的这个思路. 比方想求(A)^7那么(A)^6 ...

  3. 【递推+矩阵快速幂】【HDU2604】【Queuing】

    Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  4. HDU2604【矩阵快速幂】

    思路: 把fm看成01,f-1,m-0: 不能存在101,111; dp[i]代表第i结尾的方案数: ①:结尾是0一定行:只要i-1序列里添个0就好了,dp[i]+=dp[i-1]: ②:结尾是1   ...

  5. HDU2604:Queuing(矩阵快速幂+递推)

    传送门 题意 长为len的字符串只由'f','m'构成,有2^len种情况,问在其中不包含'fmf','fff'的字符串有多少个,此处将队列换成字符串 分析 矩阵快速幂写的比较崩,手生了,多练! 用f ...

  6. HDU 2604 Queuing( 递推关系 + 矩阵快速幂 )

    链接:传送门 题意:一个队列是由字母 f 和 m 组成的,队列长度为 L,那么这个队列的排列数为 2^L 现在定义一个E-queue,即队列排列中是不含有 fmf or fff ,然后问长度为L的E- ...

  7. 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)

    题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...

  8. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...

  9. 51nod 1113 矩阵快速幂

    题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...

随机推荐

  1. 剑指 Offer 52. 两个链表的第一个公共节点 + 链表 + 第一个公共结点 + 双指针

    剑指 Offer 52. 两个链表的第一个公共节点 Offer_52 题目详情 题解分析 可以使用两个指针 node1,node2 分别指向两个链表 headA,headB 的头结点,然后同时分别逐结 ...

  2. python工业互联网应用实战7—业务层

    本章我们演示代码是如何"进化"的,实战的企业日常开发过程中,系统功能总伴随着业务的不断增加,早期简单的代码慢慢的越来越复杂,敏捷编程中的"禅"--简单设计.快速 ...

  3. 使用jsoup十分钟内掌握爬虫技术

    对,就是十分钟,没有接触过爬虫的你,肯定一脸懵逼,感觉好高深的样子,一开始我也有点懵,但用了以后发现还是很简单的,java爬虫框架有很多,让我有种选择困难症,通过权衡比较还是感觉jsoup比较好用些, ...

  4. 在ASP.NET Core中用HttpClient(一)——获取数据和内容

    在本文中,我们将学习如何在ASP.NET Core中集成和使用HttpClient.在学习不同HttpClient功能的同时使用Web API的资源.如何从Web API获取数据,以及如何直接使用Ht ...

  5. 使用createrepo构建本地yum仓库

    rpm包安装的时候会有很多软件会出现因为其他依赖包没有,而导致安装失败的情况.一般可以连接外网的时候我们直接使用 yum 进行安装,可以为我们解决依赖包关系,但是很多工作环境下是没有外网的,内网情况下 ...

  6. Java基础:重文本markdown

    说一说markdown 前言 在系统学习Java等开发语言之前,我们应该养成写"日记"的习惯,也就是写博客:写博客的地方有博客园,csdn等.而写博客又得知道markdown重文本 ...

  7. socket 之send和recv原理剖析

    认识TCP socket的发送缓冲区和接收缓冲区 当创建一个TCP socket对象的时候会有一个发送缓冲区和一个接收缓冲区,相当与内存中的一片空间 send原理剖析 send是不是直接把数据发送给服 ...

  8. windows回收站无法设置

    win+r运行 regedit HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer 修改NoRe ...

  9. 【linux】系统编程-4-共享内存

    目录 前言 6. 共享内存 6.1 概念 6.2 操作函数 6.2.1 shmget() 6.2.2 shmat() 6.2.3 shmdt() 6.2.4 shmctl() 6.3 例子 参考: 前 ...

  10. 给我一个shell我能干翻你内网

    0x00 前言 在去年小菜鸡学了点内网知识就闲着没事跑点jboss的站看看,在经历过很多次内网横向失败之后终于算是人生圆满了一把,阿三的站一般进去之后很难横向,不知道是不是我太菜的原因,反正阿三的站能 ...