【递推+矩阵快速幂】【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 < ...
随机推荐
- 【刷题 Python Tip】题目6~10
[题目6]输出100以内的所有素数,素数之间以一个空格区分 from math import sqrt print ' '.join(str(key) for key in [x for x in x ...
- Windows Message Queue(优先队列)
欢迎参加——BestCoder周年纪念赛(高质量题目+多重奖励) Windows Message Queue Time Limit: 2000/1000 MS (Java/Others) Mem ...
- 用Jfree实现条形柱状图表,java代码实现
用Jfree实现条形柱状图表,java代码实现.可经经常使用于报表的制作,代码自己主动生成后能够自由查看.能够自由配置图表的各个属性,用来达到自己的要求和目的 package test1; impor ...
- C语言指针的初始化和赋值
1.指针的初始化 指针初始化时,"="的右操作数必须为内存中数据的地址,不能够是变量,也不能够直接用整型地址值(可是int*p=0;除外,该语句表示指针为空).此时,*p仅仅是表示 ...
- C#比较两个时间大小
DateTime t1 = Convert.ToDateTime("2012-12-31 23:59:00"); DateTime t2 = Convert. ...
- Android的Activity屏幕切换滑动动画
Activity的切换效果使用的是Android的动画效果,Android的动画在官方有相关资料:http://developer.android.com/guide/topics/graphics/ ...
- PHP学习笔记五【方法】
<?php $num1=34; $num2=90; $oper="+"; $res=0; switch($oper) { case "+": $res=$ ...
- Spring Annotation注解进行aop的学习
使用Maven管理项目,pom文件为: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=" ...
- HDU 1068 - Girls and Boys
求一个集合最多几个人,其之间任意两人没有暧昧关系. 二分图匹配 最大独立集 = 总点数 - 最大匹配数 匈牙利算法 因为每个同学都在二分图的两侧 当 A与B匹配时,B与A也匹配 所以 所求的最大匹配数 ...
- G - 密码 kmp、贪心、manachar等等等等
G - 密码 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu Submit Status ...