【HDU 2604】Queuing
题意
f和m两种字母组成字符串,fmf 和 fff 这种为不安全的字符串,现在有2*L个字母,问你有多少安全的字符串。答案mod M。
分析
递推,这题本意是要用矩阵快速幂。不过我发现这题好神奇,只要适当的减少取模的次数,就可以水过去(呵呵呵)。
当时做这题的时候用的是比较奇怪的递推式,然后超时了,但是两个两个地推也就水过去了(哈哈哈)。
正确的递推方程:f(n)=f(n-1)+f(n-3)+f(n-4)。
如果第n位是f,它前面是f时(ff),再前一位必须是m(mff),再前一位还必须是m(mmff),所以有f(n-4)种;
它前面是m时(mf),再前一位必须是m(mmf),再前就任意了,所以有f(n-3)种
第n位是m,它前面可以是任意的,所以有f(n-1)种。
接下来是构造矩阵:
代码
矩阵快速幂代码(AC)
#include<stdio.h>
#include<string.h>
int k,m,t[]={,,,,};
struct matrix
{
int a[][];
int row,col;
void init(int row,int col){
this->row=row;
this->col=col;
memset(a,,sizeof(a));
}
}u;
struct matrix b{
{{,,,},
{,,,},
{,,,},
{,,,}},
,
};
struct matrix c{
{{},{},{},{}},
,
};
matrix mul(matrix a,matrix b)
{
matrix c;
c.init(a.row,b.col);
for(int i=; i<a.row; i++)
for(int j=; j<b.col; j++)
for(int k=; k<a.col; k++)
c.a[i][j]=(c.a[i][j]%m+a.a[i][k]*b.a[k][j]%m)%m;
return c;
} matrix qpow(matrix a,int k)
{
matrix ans;
ans.init(a.row,a.col);
for(int i=;i<a.row;i++)
ans.a[i][i]=;
while(k)
{
if(k&)ans=mul(ans,a);
a=mul(a,a);
k>>=;
}
return ans;
} int main()
{
while(~scanf("%d%d",&k,&m))
{
if(k>){u=mul(qpow(b,k-),c);
printf("%d\n",u.a[][]%m);}
else printf("%d\n",t[k]%m);
}
return ;
}
奇怪的姿势一个个推,去掉两个mod就水过去了(AC)
#include<stdio.h>
int l,m,mm,mf,ff,fm,ta,tb,tc,td;
int main()
{
while(~scanf("%d%d",&l,&m))
{
if(l==)printf("%d\n",%m);
else if(l==)printf("0\n");
else
{
mm=mf=fm=ff=;
for(int i=; i<l; i++)
{
ta=mm;
tb=mf;
tc=fm;
td=ff;
mm=(tc+ta)%m;
mf=ta;//mf=ta%m;
fm=(tb+td)%m;
ff=tb;//ff=tb%m;
}
printf("%d\n",(mm+mf+fm+ff)%m);
}
}
return ;
}
奇怪的姿势两个两个推(AC)
#include<stdio.h>
int l,m;
int mm,mf,fm,ff;
int mma,mfa,fma,ffa;
int i;
int main()
{
while(~scanf("%d%d",&l,&m))
{
if(l==)printf("0\n");
else
{
if(l%){
i=;
mm=;mf=;fm=;ff=;
}else{
mm=mf=fm=ff=;
i=;
}
for(; i<l; i+=)
{
mma=mm,mfa=mf,fma=fm,ffa=ff;
mm=(mfa+ffa+fma+mma)%m;
mf=(fma+mma)%m;
fm=(mma+mfa)%m;
ff=mma%m;
}
printf("%d\n",(mm+mf+fm+ff)%m);
}
}
return ;
}
漂亮的直接推(AC)
M(1 <= M <= 30) ,所以只在计算到大于一个比较大的数时才取模,这样可以减少取模的次数。这是参考了别人的代码。
#include<stdio.h> int l,m;
int f[]={,,,,}; int main()
{
while(~scanf("%d%d",&l,&m))
{
for(int i=;i<=l;i++){ f[i]=f[i-]+f[i-]+f[i-]; if(f[i]>)
f[i]%=m;
}
printf("%d\n",f[l]%m);
}
return ;
}
【HDU 2604】Queuing的更多相关文章
- 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题
[HDU 3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...
- 【HDU 5647】DZY Loves Connecting(树DP)
pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...
- -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...
- 【HDU 2196】 Computer(树的直径)
[HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...
- 【HDU 2196】 Computer (树形DP)
[HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...
- 【HDU 5145】 NPY and girls(组合+莫队)
pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...
- 【hdu 1043】Eight
[题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1043 [题意] 会给你很多组数据; 让你输出这组数据到目标状态的具体步骤; [题解] 从12345 ...
- 【HDU 3068】 最长回文
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...
- 【HDU 4699】 Editor
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...
随机推荐
- 获取WIN10技术预览版
说明 这是一款预发行软件 在进行商业发行之前,我们可能会对 Windows Technical Preview 进行大量修改. Microsoft 不对此处提供的信息作任何明示或默示的担保. 有些产品 ...
- 09SpringMvc_再次讲一下SpringMvc的工作流:
整个SpringMvc的流程图:
- 教你10分钟内在Windows上完成Rails开发环境的安装和配置
原文:http://www.cnblogs.com/tambor/archive/2011/12/25/rails_anzhuang_railsinstaller.html 一般来说,Windows开 ...
- android实现点击背景图片不同区域实现不同事件
有时候我们拿到一张背景图片,客户要求点击图片的不同区域去跳转或者实现不同的操作事件.我们首先要确认图片的点击区域,往往我们会在布局文件那里下手,但是这样不好做适配,所以我实现了以下方法,基本功能可以实 ...
- [android界面]android中src和background区别——前景与背景
ImageView中XML属性src和background的区别: background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸.src是图片内容(前 ...
- Caffe学习系列(9):运行caffe自带的两个简单例子
为了程序的简洁,在caffe中是不带练习数据的,因此需要自己去下载.但在caffe根目录下的data文件夹里,作者已经为我们编写好了下载数据的脚本文件,我们只需要联网,运行这些脚本文件就行了. 注意: ...
- MySQL系列:查看并修改当前数据库的编码
MySQL中,数据库的编码是一个相当重要的问题,有时候我们需要查看一下当前数据库的编码,甚至需要修改一下数据库编码. 查看当前数据库编码的SQL语句为: mysql> use xxx ...
- ubuntu 16.04 mysql 相关
如何彻底卸载某一版本的数据库 彻底删除ubuntu下的mysql: 1.删除mysql的数据文件 sudo rm /var/lib/mysql/ -R 2.删除mqsql的配置文件 sudo rm / ...
- 0.HBase In Action(HBase实战,翻译)
1.HBase In Action 第一章-HBase简介(后续翻译中) 2.HBase In Action 第一章-HBase简介(1.1数据管理系统:快速学习) 3.HBase In Action ...
- 报错:'Could not load NIB in bundle: 'NSBundle解决办法
1.首先检查拼写是否正确: 2.断开连线,重新连接view与files' owner; 3.规避敏感View名.Xcode中有许多名字是系统预留的.你如果用了也会报这个错误.