题意:
      给你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 ]

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


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

int
MOD; typedef struct
{
int
mat[5][5];
}
A; A mat_mat(A a ,A b)
{

A c;
memset(c.mat ,0 ,sizeof(c.mat));
for(int
k = 1 ;k <= 4 ;k ++)
for(int
i = 1 ;i <= 4 ;i ++)
if(
a.mat[i][k])
for(int
j = 1 ;j <= 4 ;j ++)
c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD;
return
c;
}
A quick_mat(A a ,int b)
{

A c;
memset(c.mat ,0 ,sizeof(c.mat));
for(int
i = 1 ;i <= 4 ;i ++)
c.mat[i][i] = 1;
while(
b)
{
if(
b & 1) c = mat_mat(c ,a);
a = mat_mat(a ,a);
b >>= 1;
}
return
c;
} int main ()
{

A a ,b;
int
n ,num[5];
memset(a.mat ,0 ,sizeof(a.mat));
a.mat[1][4] = a.mat[2][1] = a.mat[2][4] = 1;
a.mat[3][2] = a.mat[4][3] = a.mat[4][4] = 1;
num[0] = 1 ,num[1] = 2 ,num[2] = 4 ,num[3] = 6;
while(~
scanf("%d %d" ,&n ,&MOD))
{
if(
n <= 3)
{

printf("%d\n" ,num[n] % MOD);
continue;
}

b = quick_mat(a ,n - 3);
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];
printf("%d\n" ,ans % MOD);
}
return
0;
}

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. redis过期key监听事件

    目录 redis安装 docker拉取 启动 redis 配置 命令监听 问题 程序监听 具体监听类 效果 总结 redis常用语缓存操作,但是redis功能不仅仅于此.今天我们来看看redis的ke ...

  2. 为什么要从 Linux 迁移到 BSD2

    OpenZFS on Linux,是项目的 Linux 部分,目前有 345 个活跃的贡献者,有超过 5600 个提交,而且几乎每天都有提交!一些世界上最大的 CDN 和数据存储服务在 FreeBSD ...

  3. 源码解析之 Mybatis 对 Integer 参数做了什么手脚?

    title: 源码解析之 Mybatis 对 Integer 参数做了什么手脚? date: 2021-03-11 updated: 2021-03-11 categories: Mybatis 源码 ...

  4. vue 倒计时 iOS无效

    vue实现的倒计时在苹果手机上无效,原因是因为后台返回的时间格式是'2019-1-29 17:13:04',而苹果手机只能解析这种时间格式'YYYY/MM/DD HH:mm:ss',修改后测试成功的代 ...

  5. MySQL入门(5)——运算符

    MySQL入门(5)--运算符 算术运算符 MySQL支持的算数运算符包括加.减.乘.除.求余. 符号 作用 + 加法运算 - 减法运算 * 乘法运算 / 除法运算 % 求余运算 DIV 除法运算,返 ...

  6. MongoDB学习--环境搭建记录

    Mongo安装教程,参考英文官网 基本命令, 索引的引用,索引基于地理位置的数据, win10 64位 系统中安装虚拟机 win10 系统中安装虚拟机VMwareWorkstation11 并安装 L ...

  7. C# 通过ServiceStack 操作Redis——List类型的使用及示例

    Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销, /// <summary> /// Redis list的实现为一个双向链表 ...

  8. Error message: Failed to spawn: unable to access process with pid 413 due to system restrictions; try `sudo sysctl kernel.yama.ptrace_scope=0`, or run Frida as root

    Android 8.0 在frida中使用 -f 参数报错, Error message: Failed to spawn: unable to access process with pid 413 ...

  9. windows 以管理员身份运行 代码

    1 // 以管理员身份运行本进程 2 // 1 获取本进程的文件路径. 3 TCHAR path[MAX_PATH] = { 0 }; // 需要初始化 4 DWORD dwPathSize = MA ...

  10. Spring源码之ApplicationContext

    ​ 本文是针对Srping的ClassPathXMLApplicationContext来进行源码解析,在本篇博客中将不会讲述spring Xml解析注册代码,因为ApplicationContext ...