题目: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. quick BI 修改列名备注

    有些列名太长了,所以造成些影响.注意修改即可.

  2. HTML--JS 定时刷新、时钟、倒计时

    <html> <head> <title>定时刷新时间</title> <script language="JavaScript&quo ...

  3. Git009--分支管理&创建与合并分支

    Git--分支管理&创建与合并分支 一.分支管理 本文来自于:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578 ...

  4. Postman初接触

    https://www.getpostman.com/docs/postman/launching_postman/installation_and_updates

  5. List带索引的常用方法,以及集合的三种遍历

    package cn.learn.collection.List; import com.sun.source.tree.NewArrayTree; import java.util.ArrayLis ...

  6. jq 与原生js 方法互相转换

    最近在用mui写页面,当然了在移动App里引入jq或zepto这些框架,肯定是极不理性的.虽然jq很简单,但是也有兼容问题,js基础是很重要的,jq的成功当时是因为ie6.7.8.9.10.chrom ...

  7. jsp页面注册验证问题

    <script type="text/javascript"> $(function(){ // 错误消息提示 var msg = "${msg}" ...

  8. BZOJ 4675(点分治)

    题面 传送门 分析 由于期望的线性性,我们可以分别计算每个点对对答案的贡献 有三个人取数字,分开对每个人考虑 设每个人分别取了k个数,则一共有\(C_n^k\)种组合,选到每种组合的概率为\(\fra ...

  9. [洛谷P1552] [APIO2012]派遣(左偏树)

    这道题是我做的左偏树的入门题,奈何还是看了zsy大佬的题解才能过,唉,我太弱了. 左偏树总结 Part 1 理解题目 很显然,通过管理关系的不断连边,最后连出来的肯定是一棵树,那么不难得出,当一个忍者 ...

  10. P2172 [国家集训队]部落战争(最小路径覆盖)

    P2172 [国家集训队]部落战争 每个点仅走一次:最小路径覆盖 套路地拆点,具体看代码中的$draw()$ 流量每增加1,意味着一支军队可以多走一格,代价减少1 最后答案即为总点数$-dinic() ...