题目:Queuing

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604

分析:

1)将当前格和上一格合并当作一个状态,考虑下一个格子放0(m)还是1(f).

构造转移矩阵

$\left[ \begin{array}{ccccc} . & 00 & 01 & 10 & 11 \\ 00 & 1 & 1 & 0 & 0 \\ 01 & 0 & 0 & 1 & 1 \\ 10 & 1 & 0 & 0 & 0 \\ 11 & 0 & 0 & 1 & 0 \end{array} \right] $

2)假设第一格前还有两格,为00。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
int MOD;
struct Matrix{
LL a[][];
void init(int f){
memset(a,,sizeof a);
if(f==-)return;
for(int i=;i<;++i)a[i][i]=;
}
};
Matrix operator*(Matrix& A,Matrix& B){
Matrix C;C.init(-);
for(int i=;i<;++i)
for(int j=;j<;++j)
for(int k=;k<;++k){
C.a[i][j]+=A.a[i][k]*B.a[k][j];
C.a[i][j]%=MOD;
}
return C;
}
Matrix operator^(Matrix A,int n){
Matrix Rt;Rt.init();
for(;n;n>>=){
if(n&)Rt=Rt*A;
A=A*A;
}
return Rt;
}
int main(){
int n;
Matrix A,T;
T.a[][]=T.a[][]=;T.a[][]=T.a[][]=;
T.a[][]=T.a[][]=;T.a[][]=T.a[][]=;
T.a[][]=;T.a[][]=T.a[][]=T.a[][]=;
T.a[][]=T.a[][]=;T.a[][]=;T.a[][]=;
for(;~scanf("%d%d",&n,&MOD);){
A=T^n;
LL ans=A.a[][]+A.a[][]+A.a[][]+A.a[][];
printf("%lld\n",ans%MOD);
} return ;
}

学到了一种很有趣的递推思路。

3)设f(i)为字符串长度为i时符合条件的字符串个数。枚举最后几位字符。

4)当最后一个字符为0 (m)时前n-1个字符没有限制,即为f(n-1);

当最后一个字符为1(f)时要考虑不满足的情况,那考虑最后两个字符为01(mf)和11(ff)的情况,显然要继续考虑。最后3个字符为101(fmf)、111(fff)显然不满足条件,最后3个字符为001(mmf),前n-3个字符没有限制,最后三个字符为011则要继续考虑,最后四个字符为0011,前n-4个字符没有限制,最后4个字符为1011不满足条件。综上f(n)=f(n-1)+f(n-3)+f(n-4)

数列:f(0)=1、f(1)=2、f(2)=4、f(3)=6、f(4)=9、f(5)=15 ...

添加一下:f(-1)=1、f(-2)=1、f(-3)=0;

5)构造矩阵

$\left[ \begin{array}{cccc} 0 & 0 & 0 & 1 \\ 1 & 0 & 0 & 1 \\ 0 & 1 & 0 & 1 \\ 0 & 0 & 1 & 1 \end{array} \right] $

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
int MOD;
struct Matrix{
LL a[][];
void init(int f){
memset(a,,sizeof a);
if(f==-)return;
for(int i=;i<;++i)a[i][i]=;
}
};
Matrix operator*(Matrix& A,Matrix& B){
Matrix C;C.init(-);
for(int i=;i<;++i)
for(int j=;j<;++j)
for(int k=;k<;++k){
C.a[i][j]+=A.a[i][k]*B.a[k][j];
C.a[i][j]%=MOD;
}
return C;
}
Matrix operator^(Matrix A,int n){
Matrix Rt;Rt.init();
for(;n;n>>=){
if(n&)Rt=Rt*A;
A=A*A;
}
return Rt;
}
int main(){
int n;
Matrix A,T;
T.a[][]=T.a[][]=T.a[][]=;T.a[][]=;
T.a[][]=;T.a[][]=T.a[][]=;T.a[][]=;
T.a[][]=;T.a[][]=;T.a[][]=T.a[][]=;
T.a[][]=T.a[][]=;T.a[][]=T.a[][]=;
for(;~scanf("%d%d",&n,&MOD);){
A=T^n;
LL ans=A.a[][]+A.a[][]+A.a[][];
printf("%lld\n",ans%MOD);
} return ;
}

[HDU2604]Queuing的更多相关文章

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

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

  2. HDU2604—Queuing

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604 题目意思:n个人排队,f表示女,m表示男,包含子串‘fmf’和‘fff’的序列为O队列,否则为E ...

  3. HDU2604 Queuing 矩阵初识

    Queues and Priority Queues are data structures which are known to most computer scientists. The Queu ...

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

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

  5. Queuing HDU2604

    一道递推题目 得到递推关系为  f[n]=f[n-1]+f[n-3]+f[n-4]; 用普通的枚举算法会超时 所以要用矩阵快速幂来加速 转化为矩阵即为: +1 0 1 1       F(N-1) F ...

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

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

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

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

  8. HDU2045/*HDU2604/*HDU2501/HDU2190 递推

    不容易系列之(3)-- LELE的RPG难题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  9. Message Queuing(MSMQ)

    一.前言 MicroSoft Message Queuing(微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任 ...

随机推荐

  1. Using Xmanager to connect to remote CentOS 7 via XDMCP

    Gnome in CentOS 7 tries to use local hardware acceleration and this becomes a problem when trying to ...

  2. HTML --JS 选择框

    <html> <head> <title>选择框</title> <script language="JavaScript"& ...

  3. 应用安全 - Web安全 - 逻辑漏洞整理

    短信轰炸 .Fiddler抓包repeat .burpsuite 修改 PHPSESSID ->字典爆破 如选择a-z .burpsuite手机号遍历 防御: 设置图片验证码,每次获取短信验证码 ...

  4. 利用三层交换机实现VLAN间路由(计算机网络中速率、带宽、吞吐量的概念)

    1.速率 速率是指计算机网络中的主机在数字信道上,单位时间内从一端传送到另一端的数据量,即数据传输率,也称数据率或比特率.比特(bit)是数据量的最小单位,s(秒)是时间的最小单位.所以速率单位为bi ...

  5. Eclipse常见版本和JDK常用版本对应关系

    Luna 4.4  JDK1.6Mars 4.5  JDK1.7             Neon 4.6  JDK1.8Oxygen 4.7 JDK1.8Photon 4.8  2019年3月

  6. python学习第八天二进制和字符编码有关联

    计算机所能识别只有0,1这两种状态,但是我们人类用字母,汉字,还有其他语言,那么怎么和计算机进行沟通呢,python编程语言最早unicode,现在统一用utf8,UTF8通用的编码语言,所有语言都包 ...

  7. 一些常见的js校验

    今天有时间来总结一下那些常用的js校验: vernull = function(value){//非空校验 if(value.trim(value).length == 0){ return fals ...

  8. XML处理指令

    “处理指令(PIs)允许文档包含用于应用程序的指令.指令并不是文档字符数据的一部分,但是必须通过应用程序传递”. 处理指令可以用于将信息传递给应用程序.处理指令可以出现在文档任意位置的标记外部.可以出 ...

  9. 基本的bash shell

    一.linux文件系统 linux文件系统结构是从Unix文件结构演进过来的.在linux文件系统中,通用的目录名用于表示一些常见的功能.如下表列出一些较为常见的Linux顶层虚拟目录名及其内容. / ...

  10. 基于Xilinx Zynq的计算处理平台

    基于Xilinx Zynq XC7Z045 FFG 900的高性能计算模块 本模块基于Xilinx公司的FPGA XC7Z045 FFG 9000 芯片, 支持64bitDDR3, 容量2GByte: ...