此题如果直接利用递推关系,处理不好会超内存的。

首先找出递推关系式,先给出递推关系式:( L )=( L - 1 ) + ( L - 3 ) + ( L - 4 );可以先尝试推导一下,推不出来再看下面的解释。

PS.以前做过一个类似的递推关系的题。

考虑当L=n时的情况,有两种情况:

①.如果最后一个字符为m :此时,只要前面长度为n-1的串符合要求,则当前长度为n的串必然符合要求。

②.如果最后一个字符为f:此时,无法确定,因为可能存在不符合要求的串,继续分情况讨论

(1).最后倒数二个字符为f,仍然可能存在不符合要求的串,继续分情况讨论

1.倒数第三个字符为f,因为存在fff,所以该种情况必然不符合要求,舍去

2.倒数第三个字符为m,仍然有可能不符合要求,再分

a.最后第四个字符为f,存在fmf,所以该种情况必然不符合要求,舍去

b.最后第四个字符为m,只要前面长度为n-4的串符合要求,则当前长度为n的串必然也符合要求

(2).最后第二个字符为m,存在可能不符合要求的情况,分

1.最后第三个字符为f,存在fmf,此时必然不符合要求舍去

2.最后第三个字符为m,只要前面长度为n-3的串的情况符合要求,则当前长度为n的串必然符合要求。

所以讲符合要求的情况相加就得到:( L )=( L - 1 ) + ( L - 3 ) + ( L - 4 );

前面已经讲过如果只是用普通递归方法会超内存,所以这里要考虑优化。

怎么优化?先看下面的矩阵相乘的结果:

x矩阵是多少会得到后面的矩阵?我们只需考虑后面矩阵的第一行,因为其他元素为0.

第1行第1列的元素我们需要得到f ( n ),因为f(n)=f(n-1)+f(n-3)+f(n-4); 所以我们必须保留f(n-1),f(n-3),f(n-4) 所以与之相乘的数必须为1.

所以第1列元素可以确定,为1 0 1 1,注意,是第一列而不是第一行。

根据第一行第二列元素,我们可以确定x矩阵第二列元素:1 0 0 0.

根据第一行第三列元素,我们可以确定x矩阵第三列元素:0 1 0 0.

根据第一行第四列元素,我们可以确定x矩阵第四列元素:0 0 1 0.

所以x矩阵已经确定,所以我们可以得到下面的矩阵乘式:

所以,反复乘以x矩阵就可以得到想要的f(n);

所以可以先求出x矩阵的L-4(不是L)次方,到这就转化为了矩阵快速幂问题。然后在用  f(4)   f(3)  f(2)   f(1)   乘以求次方后的矩阵的第一列元素  ,相加就得到f(n)=res[0][0]*f[4]+res[1][0]*f[3]+res[2][0]*f[2]+res[3[0]*f[1]。


#include<iostream>
#include<cstring>
#include<string>
#define maxn 5
using namespace std;
struct mat{
int a[maxn][maxn];
};
mat mat_mul(mat x,mat y,int Mod){
mat ans;
memset(ans.a,,sizeof(ans.a));
for (int i=;i<;i++)
for (int j=;j<;j++)
for (int k=;k<;k++){
ans.a[i][j]+=x.a[i][k]*y.a[k][j];
ans.a[i][j]%=Mod;
}
return ans;
}
void mat_pow(mat &res,int k,int Mod){ //res的k次方
mat c=res;
k--;
while (k){
if (k&) res=mat_mul(res,c,Mod);
k>>=;
c=mat_mul(c,c,Mod);
}
}
int main(){
int l,m;
while (cin >> l >> m){
int f[]={};
f[]=;f[]=;f[]=;f[]=;
mat res;
memset(res.a,,sizeof(res.a));
res.a[][]=res.a[][]=res.a[][]=res.a[][]=res.a[][]=res.a[][]=;
if (l<=){
cout << f[l]%m << endl;
continue;
}
else mat_pow(res,l-,m);
int ans=;
for (int i=;i<;i++){
ans+=res.a[i][]*f[-i]%m;
}
cout << ans%m << endl;
}
}

hdoj2604 Queuing(矩阵快速幂)的更多相关文章

  1. HDU.2640 Queuing (矩阵快速幂)

    HDU.2640 Queuing (矩阵快速幂) 题意分析 不妨令f为1,m为0,那么题目的意思为,求长度为n的01序列,求其中不含111或者101这样串的个数对M取模的值. 用F(n)表示串长为n的 ...

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

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

  3. hdu---(2604)Queuing(矩阵快速幂)

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

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

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

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

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

  6. HDU - 2604 Queuing(递推式+矩阵快速幂)

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

  7. hdu 2604 Queuing(动态规划—>矩阵快速幂,更通用的模版)

    题目 最早不会写,看了网上的分析,然后终于想明白了矩阵是怎么出来的了,哈哈哈哈. 因为边上的项目排列顺序不一样,所以写出来的矩阵形式也可能不一样,但是都是可以的 //愚钝的我不会写这题,然后百度了,照 ...

  8. hdu 2604 Queuing(矩阵快速幂乘法)

    Problem Description Queues and Priority Queues are data structures which are known to most computer ...

  9. [hdu 2604] Queuing 递推 矩阵快速幂

    Problem Description Queues and Priority Queues are data structures which are known to most computer ...

随机推荐

  1. HTML5新协议介绍 WebSocket

    WebSocket protocol 是HTML5一种新的协议(protocol).它是实现了浏览器与服务器全双工通信(full-duplex). 现在,很多网站为了实现即时通讯(real-time) ...

  2. loadrunner11--集合点(Rendezvous )菜单是灰色不能点击

    新建场景的时候“Manual Scenario”下的check box不能选中,取消选中就好了.即Vuser不能以百分比的形式. 所以:集合点灰化有两种情况: 脚本没有添加集合点函数 场景中设置以Vu ...

  3. ObjC.instancetype

    1. instancetype http://nshipster.com/instancetype/ 2. Objc的扩展 http://clang.llvm.org/docs/LanguageExt ...

  4. common常用到的类

    org.apache.commons.codec.digest.DigestUtils.md5Hex(String)    md5

  5. eclipse 远程调试mapreduce

    使用环境:centos6.5+eclipse(4.4.2)+hadoop2.7.0 1.下载eclipse hadoop 插件  hadoop-eclipse-plugin-2.7.0.jar 粘贴到 ...

  6. 项目解析1、登录验证用户是否存在 储备知识 Python 之 decorator装饰器

    下面是我对 装饰器 这一小节的总结, 以及自己的理解. 注:[本文中的代码参考上述教程] 很多时候我会把Python的很多语法与C++相融合,在C++中,函数的名称即为函数的地址,我们可以通过定义成为 ...

  7. devexpress v14.2.3 发布

    补丁而已. New Major Features in 14.2 What's New in VCL Products 14.2 Breaking Changes To learn about bre ...

  8. 2018.09.02 Atcoder Regular Contest 102简要题解

    比赛传送门 T1 Triangular Relationship 分析之后发现有两种情况: 1. n为奇数,那么所有数都是k的倍数. 2. n为偶数,那么所有数都是k/2的倍数. 然后就可以愉快A题了 ...

  9. 2018.08.12 bzoj5301: [Cqoi2018]异或序列(前缀和+莫队)

    传送门 简单的异或前缀和处理+莫队统计答案. 惊奇的发现无论开不开long long都能跑过... 代码: #include<bits/stdc++.h> #define N 100005 ...

  10. IntelliJ IDEA 2017版 编译器使用学习笔记(一) (图文详尽版);IDE快捷键使用;IDE多行代码同时编写

    IntellJ是一款强大的编译器,那么它有很多实用的功能 一.鼠标点击减少效率,快捷键实现各种跳转 (1)项目之间的跳转 快捷键位置: 操作:首先要有两个项目,然后,在不同窗口打开:如图: 然后使用快 ...