【递推+矩阵快速幂】【HDU2604】【Queuing】
Queuing
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3032 Accepted Submission(s): 1379

Now we define that ‘f’ is short for female and ‘m’ is short for male. If the queue’s length is L, then there are 2L numbers of queues. For example, if L = 2, then they are ff, mm, fm, mf . If there exists a subqueue as fmf or fff, we call it O-queue
else it is a E-queue.
Your task is to calculate the number of E-queues mod M with length L by writing a program.
3 8
4 7
4 8
6
2
1
FFF FMF
一.找递推公式
考虑最后若直接加M 显然可以成立 所以F[n]=F[n-1]+X
若要在后面加F 考虑N-1是没办法的
考虑N-2 FF MF 依旧没办法
考虑N-3 FFF FMF MMF MFF (FFF,FMF 已经不可能 不考虑)
显然添加MMF 前面N-3无论是什么都不可能会出现FFF,FMF了
所以F[n]=F[n-1]+F[n-3]+X
但是 若添加MFF 可能会出现FMFF
考虑N-4 FMFF MMFF 显然MMFF可以取了
所以 F[n]=F[n-1]+F[n-3]+F[n-4]
二.设计矩阵
注:矩阵十分好设计 第一排即为递推公式的系数
以后几排类似于单位矩阵
三.矩阵快速幂
类似非递归快速幂
node kuaisumi(node A,int N,int mod)
{
node di=e;
while(N>0)
{
if(N&1)
{
di=MatrixMult(di,A,mod);
}
A=MatrixMult(A,A,mod);
N=N>>1;
}
return di;
}
最后代码如下:
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
using namespace std;
int L,M;
struct node
{
int mat[5][5];
}a,e,ans;
int mat2[5];
void CSH()
{
mat2[1]=9;
mat2[2]=6;
mat2[3]=4;
mat2[4]=2;
for(int i=1;i<=4;i++)
{
e.mat[i][i]=1;
mat2[i]=mat2[i]%M;
}
memset(a.mat,0,sizeof(a.mat));
a.mat[1][1]=a.mat[1][3]=a.mat[1][4]=1;
a.mat[2][1]=a.mat[3][2]=a.mat[4][3]=1;
}
node MatrixMult(node A,node B,int mod)
{
node p;
memset(p.mat,0,sizeof(p.mat));
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
{
for(int k=1;k<=4;k++)
p.mat[i][j]+=A.mat[i][k]*B.mat[k][j];
p.mat[i][j]=p.mat[i][j]%mod;
}
return p;
}
node kuaisumi(node A,int N,int mod)
{
node di=e;
while(N>0)
{
if(N&1)
{
di=MatrixMult(di,A,mod);
}
A=MatrixMult(A,A,mod);
N=N>>1;
}
return di;
}
void solve()
{
int ANS=0;
for(int i=1;i<=4;i++)
{
ANS+=ans.mat[1][i]*mat2[i];
ANS=ANS%M;
}
printf("%d\n",ANS);
}
int main()
{
while(cin>>L>>M)
{
CSH();
if(L>4)
ans=kuaisumi(a,L-4,M);
if(L>4)
solve();
else
printf("%d\n",mat2[L]);
}
return 0;
}
【递推+矩阵快速幂】【HDU2604】【Queuing】的更多相关文章
- hdu 2604 递推 矩阵快速幂
HDU 2604 Queuing (递推+矩阵快速幂) 这位作者讲的不错,可以看看他的 #include <cstdio> #include <iostream> #inclu ...
- HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- hdu2604(递推,矩阵快速幂)
题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...
- [hdu 2604] Queuing 递推 矩阵快速幂
Problem Description Queues and Priority Queues are data structures which are known to most computer ...
- HDU 2842 (递推+矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目大意:棒子上套环.第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上.每个 ...
- Recursive sequence HDU - 5950 (递推 矩阵快速幂优化)
题目链接 F[1] = a, F[2] = b, F[i] = 2 * F[i-2] + F[i-1] + i ^ 4, (i >= 3) 现在要求F[N] 类似于斐波那契数列的递推式子吧, 但 ...
- HDU6030 Happy Necklace(递推+矩阵快速幂)
传送门:点我 Little Q wants to buy a necklace for his girlfriend. Necklaces are single strings composed of ...
- 五校联考R1 Day1T3 平面图planar(递推 矩阵快速幂)
题目链接 我们可以把棱柱拆成有\(n\)条高的矩形,尝试递推. 在计算的过程中,第\(i\)列(\(i\neq n\))只与\(i-1\)列有关,称\(i-1\)列的上面/下面为左上/左下,第\(i\ ...
- LightOJ 1244 - Tiles 猜递推+矩阵快速幂
http://www.lightoj.com/volume_showproblem.php?problem=1244 题意:给出六种积木,不能旋转,翻转,问填充2XN的格子有几种方法.\(N < ...
随机推荐
- iOS 系统架构 && 常用 framework
整理自互联网,感谢原文作者! 1.iOS基于UNIX系统,因此从系统的稳定性上来说它要比其他操作系统的产品好很多 2.iOS的系统架构分为四层,由上到下一次为:可触摸层(Cocoa Touch lay ...
- java的wait和notifyAll使用方法
class Num { private int num; public int getNum() { return num; } public void setNum(int num) { this. ...
- Elon Musk:同一时候颠覆几个行业的科技狂人
在苹果著名的"不同凡想"广告中,赞扬了那些改变世界的疯狂家伙们."他们不喜欢墨守成规,也不愿安于现状","他们改变了事物","他们 ...
- ffmpeg学习笔记
对于每一个刚開始学习的人,刚開始接触ffmpeg时,想必会有三个问题最为关心,即ffmpeg是什么?能干什么?怎么開始学习?本人前段时间開始接触ffmpeg,在刚開始学习过程中.这三个问 ...
- Redux中的重要概念
Action/Reducer/Store 首先,先看看第一张图,图中展示了Redux的单向数据流,以及Action.Reducer和Store这三个核心概念. 下面就围绕上图,非别介绍Action.R ...
- linux下php扩展curl的安装
方法一 安装cURL wget http://curl.haxx.se/download/curl-7.17.1.tar.gz tar -zxf curl-7.17.1.tar.gz ./config ...
- 【降维解法:最大字段和->最大子矩阵和->最终版最大子长方体和】【UVA10755】Garbage Heap
突然感觉刷完这一套专题后 码力有了质的飞跃,fighting 努力会有结果! 最大字段和是一个很经典的问题 O(n)算法 而对于最大子矩阵和 可以思考一个这样的想法 枚举上下边界i,j把i到j这一段的 ...
- Android应用自动更新功能的实现!!!
自动更新功能的实现原理,就是我们事先和后台协商好一个接口,我们在应用的主Activity里,去访问这个接口,如果需要更新,后台会返回一些数据(比如,提示语:最新版本的url等).然后我们给出提示框,用 ...
- foreach的用法(转)
JDK1.5加入的增强for和循环. foreach语句使用总结增强for(part1:part2){part3}; part2中是一个数组对象,或者是带有泛性的集合. part1定义了一个局部变量, ...
- [Math]Reverse Integer
Total Accepted: 111287 Total Submissions: 474471 Difficulty: Easy Reverse digits of an integer. Exam ...