[HDU2604]Queuing
题目: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的更多相关文章
- hdu---(2604)Queuing(矩阵快速幂)
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- HDU2604—Queuing
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2604 题目意思:n个人排队,f表示女,m表示男,包含子串‘fmf’和‘fff’的序列为O队列,否则为E ...
- HDU2604 Queuing 矩阵初识
Queues and Priority Queues are data structures which are known to most computer scientists. The Queu ...
- 【递推+矩阵快速幂】【HDU2604】【Queuing】
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- Queuing HDU2604
一道递推题目 得到递推关系为 f[n]=f[n-1]+f[n-3]+f[n-4]; 用普通的枚举算法会超时 所以要用矩阵快速幂来加速 转化为矩阵即为: +1 0 1 1 F(N-1) F ...
- HDU2604:Queuing(矩阵快速幂+递推)
传送门 题意 长为len的字符串只由'f','m'构成,有2^len种情况,问在其中不包含'fmf','fff'的字符串有多少个,此处将队列换成字符串 分析 矩阵快速幂写的比较崩,手生了,多练! 用f ...
- hdu2604(递推,矩阵快速幂)
题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...
- HDU2045/*HDU2604/*HDU2501/HDU2190 递推
不容易系列之(3)-- LELE的RPG难题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- Message Queuing(MSMQ)
一.前言 MicroSoft Message Queuing(微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任 ...
随机推荐
- 史上最全 ——LINQ to SQL语句
LINQ to SQL语句(1)之Where 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操 ...
- python匿名函数应用--动态计算器
匿名函数: 一般用于函数体较为简单的运算,和一些不需要函数名的传递. lambda 参数1:运算举例: func = lambda x,y:x+y :可以给匿名函数添加变量名. 匿名函数的应用: ...
- MySQL 1130错误,无法远程连接
错误:ERROR 1130: Host '192.168.1.3' is not allowed to connect to thisMySQL serve 错误1130:主机192.168.1.3” ...
- SAP smartforms打印数据出框线或跟框线重叠,但是预览是正常的
如图,打印内容压在框线上,但是打印预览是正常的 预览图如下,预览是正常的 预览用PDF!命令,导出PDF,也是正常的,就直接打印有问题,不是打印机的问题,用Adobe PDF打印机也是不行 如果只有一 ...
- rancher部署K8S
环境:centos7 docker 日期准确 关闭防火墙 安装docker 创建 vim /etc/docker/daemon.json { "registry-mirrors&quo ...
- k8s入门教程
1. k8s概述 Kubernetes(简称K8S) 是Google开源的分布式的容器管理平台,方便我们在服务器集群中管理我们容器化应用. 教程主要介绍怎么使用阿里云容器服务(kubernetes版本 ...
- Panabit镜像功能配合wireshark抓包的方法
Panabit镜像功能配合wireshark抓包的方法 Panabit的协议识别都是基于数据包的特征,因此捕获数据包样本是我们进行识别第一步要做的事情.下面就和大家说一下如何捕获网络应用的数据包. 到 ...
- JavaScript 正则表达式中的特殊字符
正则表达式中的特殊字符 字符 含义 \ 依照下列规则匹配: 在非特殊字符之前的反斜杠表示下一个字符是特殊字符,不能按照字面理解.例如,前面没有 "\" 的 "b" ...
- CSS3中resize属性
说明: resize属性是指定一个元素是否可由用户调整大小的. 语法: resize:none | both | horizontal | vertical none:用户不可一调整元素的尺寸(默认值 ...
- Solr的学习使用之(四)建数据库(添加Core)、表(配置schema.xml)
1.数据库数据库就相当于solr里面的核.solr4.6不能使用界面提供的的Core Admin/Add Core来建立,会报错,不懂为啥:那就采用最 简单的办法:把solr下载包里面的\solr-4 ...