HDU_2604 矩阵快速幂 较难推的公式
一个排队问题,f代表女,m代表男,f和m出现的几率相等。问一个长为L的队伍不能出现 fmf 和 fff这样的串总共有多少种。
这个题目的公式递推略难啊。。。我看了别人博客才想明白原来是这么递推出来的。
首先把前几项写出来。
L=0 ,ans=0;
L=1,ans=2;
L=2,ans=4;
L=3,ans=6;
L=4,ans=9;
规律有点难找,直接递推出来,假设 长度为n的串,n>4,ans[n] 无非就是在 ans[n-1]的基础上加一个 f或者m,如果在ans[n-1]的基础上在队列最后加一个m,则绝对合法,因为不论前面n-1个是怎么排列,最后加一个m,绝对不会构成fmf或者fff,所以 ans[n]+=f[n-1]; 但是如果最后一位加的是f,
就要分类讨论了:
这个时候,如果n-1位为m,则 n-2位一定要是m 也就是说 一定要 ans[n-3]+mmf才满足条件,于是ans[n]+=ans[n-3]
这个时候,如果n-1位为f,则n-2位必定为m(否则就后三位fff了),不仅如此,第n-3位一定要是m(否则就fmf了),所以就要 ans[n-4]+mmff,所以ans+=ans[n-4];
所以最后的递推出来的公式就是 ans[n]=ans[n-1]+ans[n-3]+ans[n-4];
得此公式,构造出矩阵。。。凡是学过矩阵快速幂的应该都会写了。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int l,m;
int date[];
struct Mat{
int mat[][];
};
Mat s,E;
Mat operator *(Mat a,Mat b)
{
Mat c;
memset(c.mat,,sizeof (Mat));
int i,j,k;
for (i=;i<;i++)
for (j=;j<;j++)
for (k=;k<;k++)
{
if(a.mat[i][k] && b.mat[k][j])
c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
c.mat[i][j]%=m;
}
return c;
}
Mat operator ^(Mat a,int x)
{
Mat c=E;
for (;x;x>>=)
{
if (x&)
c=c*a;
a=a*a;
}
return c;
}
void init()
{
date[]=;
date[]=;
date[]=;
date[]=;
date[]=;
memset(s.mat,,sizeof (Mat));
memset(E.mat,,sizeof (Mat));
s.mat[][]=s.mat[][]=s.mat[][]=;
s.mat[][]=;
s.mat[][]=;
s.mat[][]=; for (int i=;i<;i++)
E.mat[i][i]=;
}
int main()
{
init();
while (scanf("%d%d",&l,&m)!=EOF)
{
if (l<=)
{
printf("%d\n",date[l]%m);
continue;
}
Mat ans;
ans=s^(l-);
int sum=;
for (int i=;i<;i++)
{
sum+=ans.mat[][i]*date[-i];
}
sum%=m;
printf("%d\n",sum);
}
return ;
}
HDU_2604 矩阵快速幂 较难推的公式的更多相关文章
- HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with ...
- CH 3401 - 石头游戏 - [矩阵快速幂加速递推]
题目链接:传送门 描述石头游戏在一个 $n$ 行 $m$ 列 ($1 \le n,m \le 8$) 的网格上进行,每个格子对应一种操作序列,操作序列至多有 $10$ 种,分别用 $0 \sim 9$ ...
- HDU 1757 矩阵快速幂加速递推
题意: 已知: 当x<10时:f(x)=x 否则:f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + --+ a9 * f(x-10); 求:f(x ...
- CH3401 石头游戏(矩阵快速幂加速递推)
题目链接:传送门 题目: 石头游戏 0x30「数学知识」例题 描述 石头游戏在一个 n 行 m 列 (≤n,m≤) 的网格上进行,每个格子对应一种操作序列,操作序列至多有10种,分别用0~9这10个数 ...
- HDU5950 Recursive sequence (矩阵快速幂加速递推) (2016ACM/ICPC亚洲赛区沈阳站 Problem C)
题目链接:传送门 题目: Recursive sequence Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total ...
- BZOJ4547 Hdu5171 小奇的集合 【矩阵快速幂优化递推】
BZOJ4547 Hdu5171 小奇的集合 Description 有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值.(数据保证这个 ...
- AcWing 226. 233矩阵 (矩阵快速幂+线性递推)打卡
题目:https://www.acwing.com/problem/content/228/ 题意:有一个二维矩阵,这里只给你第一行和第一列,要你求出f[n][m],关系式有 1, f[0][ ...
- [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)
Description 阿 申准备报名参加GT考试,准考证号为N位数X1X2....Xn(0<=Xi<=9),他不希望准考证号上出现不吉利的数字.他的不吉利数学 A1A2...Am(0&l ...
- [bzoj1008](HNOI2008)越狱(矩阵快速幂加速递推)
Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 In ...
随机推荐
- 提升Windows系统舒适度软件
1.Geek Uninstaller 卸载软件 2.PotPlayer 无广告播放器
- <深入理解redis>读书笔记
chapter2 键管理与数据结构 对大多数redis解决方案而言,键的命名设计至关重要.对于管理来说,内存消耗和redis性能都与数据结构设计相关.所以对开发者而言,最好有数据结构的命名文档规范. ...
- 从零到Django大牛的的进阶之路01
搭建 创建虚拟环境 mkvirtualenv django_py3_1.11 -p python3 安装Django pip install django==1.11.11 创建工程 django-a ...
- HDU - 6152 Friend-Graph(暴力)
题意:给定n个人的关系,若存在三个及以上的人两两友好或两两不友好,则"Bad Team!",否则"Great Team!". 分析:3000*3000内存100 ...
- UVA - 225 Golygons (黄金图形)(回溯)
题意:平面有k个障碍点.从(0,0)出发,第一次走1个单位,……,第n次走n个单位,恰好回到(0,0),每次必须转弯90°,图形可以自交,但不能经过障碍点.按字典序输出所有移动序列,并输出序列总数. ...
- Rabbitmq之高级特性——实现消费端限流&NACK重回队列
如果是高并发下,rabbitmq服务器上收到成千上万条消息,那么当打开消费端时,这些消息必定喷涌而来,导致消费端消费不过来甚至挂掉都有可能. 在非自动确认的模式下,可以采用限流模式,rabbitmq ...
- 记一次docker使用异常
背景: win10 docker 有几天没有用Oracle数据库,突然发现数据库挂了 docker start oracle 报错 具体错误信息: Error starting userland pr ...
- web安全(xss攻击和csrf攻击)
1.CSRF攻击: CSRF(Cross-site request forgery):跨站请求伪造. (1).攻击原理: 如上图,在B网站引诱用户访问A网站(用户之前登录过A网站,浏览器 cookie ...
- Python 打开文件(File Open)
版权所有,未经许可,禁止转载 章节 Python 介绍 Python 开发环境搭建 Python 语法 Python 变量 Python 数值类型 Python 类型转换 Python 字符串(Str ...
- mysql 索引使用教程
1.什么索引 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的位置信息.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度. ...