hdu 2604 Queuing AC自动机构造递推式-矩阵-结果
http://acm.hdu.edu.cn/showproblem.php?pid=2604
题意:
L个人排队,这一队里男性用m表示,女性用f表示,问长度为L的序列里面不包含形如"fmf"和"fff"的可能的排队的数量:
AC大牛的图:
然后AC大牛给出了递推式:
S0表示其他状态
S1表示状态的后缀是(f),为了不和S2重复,姑且当成是(mf),其他状态同.
其他的图上应该很明确了.现在就是状态转移
显然在有后缀为fmf or fff以后后面无论加什么那么状态都不会变化了,于是
假设dp[i][j]表示长为i,后缀状态为j的方案数
dp[n][5]=2*dp[n-1][5]+dp[n-1][3]
dp[n][4]=2*dp[n-1][4]+dp-n-1][2]
dp[n][3]=dp[n-1][2]+dp[n-1][1]
dp[n][2]=dp[n-1][1]
dp[n][1]=dp[n-1][0]
dp[n][0]=dp[n-1][3]+dp[n-1][0]
我们构造矩阵
(f[n][5],f[n][4],f[n][3],f[n][2],f[n][1],f[n][0]) = {(201000),(020100),(000110),(000010),(000001),(001001)}*(f[n - 1][5],f[n - 1][4],f[n - 1][3],f[n - 1][2],f[n - 1][1],f[n - 1][0]);
然后利用矩阵快速幂求值然后再乘以(f[1][5],f[1][4],f[1][3],f[1][2],f[1][1],f[1][0])=(000011)即可:
//#pragma comment(linker,"/STACK:327680000,327680000")
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue>#define CL(arr, val) memset(arr, val, sizeof(arr))#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define ll long long
#define L(x) (x) << 1
#define R(x) (x) << 1 | 1
#define MID(l, r) (l + r) >> 1
#define Min(x, y) (x) < (y) ? (x) : (y)
#define Max(x, y) (x) < (y) ? (y) : (x)
#define E(x) (1 << (x))
#define iabs(x) (x) < 0 ? -(x) : (x)
#define OUT(x) printf("%I64d\n", x)
#define lowbit(x) (x)&(-x)
#define Read() freopen("din.txt", "r", stdin)
#define Write() freopen("dout.txt", "w", stdout);#define M 23
#define N 1007
#define chN 50
using namespace std;int n,m;
struct Mat
{int mat[6][6];void init(){CL(mat,0);mat[0][0] = mat[1][1] = 2;mat[0][2] = mat[1][3] = mat[2][3] = mat[2][4] = mat[3][4] = mat[4][5] = mat[5][2] = mat[5][5] = 1;}
}a;Mat operator*(Mat a,Mat b)
{Mat c;int i,j,k;CL(c.mat,0);for (i = 0; i < 6; ++i){for (j = 0; j < 6; ++j){for (k = 0; k < 6; ++k){if (!a.mat[i][k] || !b.mat[k][j]) continue;c.mat[i][j] += a.mat[i][k]*b.mat[k][j];if (c.mat[i][j] > m) c.mat[i][j] %= m;}}}return c;
}
Mat operator^(Mat a,int k)
{Mat c;int i,j;for (i = 0; i < 6; ++i){for (j = 0; j < 6; ++j){c.mat[i][j] = (i == j);}}while (k){if (k&1) c = c*a;k >>= 1;a = a*a;}return c;
}
int main()
{// Read();int i;while (~scanf("%d%d",&n,&m)){a.init();Mat res;res = a^(n - 1);int ans = 0;for (i = 2; i < 6; ++i){ans += res.mat[i][4] + res.mat[i][5];}printf("%d\n",ans%m);}return 0;
}
hdu 2604 Queuing AC自动机构造递推式-矩阵-结果相关推荐
- 牛客14607 递推(矩阵快速幂构造)
链接:https://ac.nowcoder.com/acm/problem/14607 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K,其他语言2621 ...
- 超前进位加法器原理与递推式超详细推导+verilog实现与测试
当记忆的线缠绕过往支离破碎,是慌乱占据了心扉.----<寂寞沙洲冷> 超前进位加法器原理 1. 一位二进制的加法 首先考虑两个1位二进制相加 a+b,不考虑上一级的进位,0和1简单相加,即 ...
- 从递推式到通项公式 特征方程学习笔记
参考文章 ruanxingzhi 引入 对于一些递推式,我们常常会有关于求数列某一项的问题,如果我们能推出其通项公式,那么问题就会变得更好解决,特征方程就是一个有力的工具. 相关定义及引理 我们定义对 ...
- 【递推法】错排问题的递推式和推导过程
[递推法]错排问题的递推式和推导过程 前言:这篇博客是帮助没有见过错排的新人更好的理解错排问题的递推式和推导过程,各位大佬可自行跳过 题目链接:洛谷P1595信封 一.错排问题的定义: 很多人 ...
- 算法分析中递推式的一般代数解法
算法分析中经常遇到需要求解递推式的情况,即将递推式改写为等价的封闭形式.例如汉诺塔问题的时间复杂度递推形式为T(n)=2T(n−1)+1(n≥1)T(n)=2T(n−1)+1(n≥1),可以解出封闭形 ...
- UVA - 10253 Series-Parallel Networks(递推式、记忆化搜索写法)
题目:UVA-10253 题目翻译(来自蓝书): 串并联网络有两个端点,一个叫源,一个叫汇,递归定义如下: (1) 一条单独的边是串并联网络. (2) 若G1和G2是串并联网络,把它们的源和源接在一起 ...
- 【模板】BM + CH(线性递推式的求解,常系数齐次线性递推)
这里所有的内容都将有关于一个线性递推: $f_{n} = \sum\limits_{i = 1}^{k} a_{i} * f_{n - i}$,其中$f_{0}, f_{1}, ... , f_{k ...
- 2019蓝桥杯A组:数列求值(递推式)
三.题目:数列求值 给定数列 1, 1, 1, 3, 5, 9, 17, -,从第 4 项开始,每项都是前 3 项的和.求 第 20190324 项的最后 4 位数字. [答案提交] 这是一道结果填空 ...
- AcWing 885. 求组合数 I(递推式预处理)
题面连接 https://www.acwing.com/problem/content/887/ 思路 通过组合数学的知识我们能知道Cab=Ca−1b+Ca−1b−1C_a^b = C_{a-1}^b ...
最新文章
- 一起谈.NET技术,在没有安装 ASP.NET MVC3 的服务器上运行 MVC3
- html如何复用其它页面,编写可以复用的 HTML 模板
- 2019ACM浪潮杯山东省赛参赛总结
- python实现接口自动化的视频_python实现头条项目接口自动化测试实战
- 51 NOD 1013 3的幂的和
- typescript之nodejs开发
- 特殊Office Communicator 2007 R2 Outlook集成错误
- 爬虫 页面元素变化_爬虫项目案例讲解 案例二:定位、爬虫、定位页面元素、分别定位、简单处理抓取数据(有总结)...
- 高效办公之思维导图半小时从入门与精通(Xmind2020版)
- 测试还是国外的香?走进海外测试开发工程师
- Google Chrome 谷歌浏览器如何设置在新标签页打开地址栏的网址
- JS 基础篇(音量调节器)
- 成都拓嘉启远:如何全面看待拼多多百亿补贴
- 计算机五子棋博弈发展历史,五子棋计算机博弈系统的研究与设计
- ​想知道与你最般配的伴侣长什么样?这个“夫妻相”生成器要火
- 雷达数据 障碍物判断_数据科学的进入障碍
- Eureka 的 Application Service 客户端的注册以及运行示例
- 把矩阵化成行最简型(伪)
- Linux中awk详解(2)
- 微信公众号使用:查看和下载微信公众号的二维码
热门文章
- 线上 ELK 集群健康值 red 状态问题排查与解决
- GCC为什么不将a * a * a * a * a * a优化为(a * a * a)*(a * a * a)?
- 文件的属性 计算机知识,计算机基础知识文件的属性(二)
- c语言中用于程序化结构设计的三种结构是,c语言中用于结构化程序设计的3种基本结构是...
- java mvc .net mvc_.NET MVC 和 JAVA MVC有什么区别?
- win10安全中心关闭不了怎么办
- windows查看usb信息命令_ADB命令你知道多少?ADB冻结系统应用?
- 前端命名规范_值得收藏的前端命名规范
- python面向对象编程指南 脚本之家_Python面向对象编程之继承与多态详解
- 实验4-2-2 求e的近似值 (15 分)