【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 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...
随机推荐
- YOU ARE MY SUNSHINE
/*you are sunshine, my only sunshine, you make me happy when skies are grey. you'll never know dear ...
- 纯CSS3制作卡通场景汽车动画效果
前言 今天分享一下我昨晚做的CSS3动画效果——卡通场景汽车动画.在接触CSS3动画之前,我之前实现一些简单的动画效果都是使用flash完成的.但是自从CSS3横空出世,在移动端对CSS3动画的运用越 ...
- 各浏览器对typeof运算符的实现差异
1,IE6/7/8中typeof运算符对BOM对象如window,document,location,history等对象的方法返回“object”,标准浏览器都返回“function”. 1 2 3 ...
- GIT 专贴
1.官网 git-scm.com github.com 代码库 2.源码
- 【转】【C#】在 Windows 窗体 DataGridView 单元格中承载控件
using System; using System.Windows.Forms; public class CalendarColumn : DataGridViewColumn { public ...
- [py] 导入模块 reload(sys)
#!/usr/bin/env python # coding: utf-8 import sys reload(sys) #<------这个是什么意思 sys.setdefault ...
- 在WebApi中实现Cors访问
Cors是个比较热的技术,这在蒋金楠的博客里也有体现,Cors简单来说就是“跨域资源访问”的意思,这种访问我们指的是Ajax实现的异步访问,形象点说就是,一个A网站公开一些接口方法,对于B网站和C网站 ...
- python 调用 shell 命令方法
python调用shell命令方法 1.os.system(cmd) 缺点:不能获取返回值 2.os.popen(cmd) 要得到命令的输出内容,只需再调用下read()或readlines()等 ...
- Objective-c基础学习
核心内容 标识号 OC语言中,对各种变量,方法和类等要素命名时使用的字符序列称为标识符. OC标识符命名规则标识符由字母,下划线“_”,美元符号“$”和数字组成,标识符必须以字母,下划线,美元符号开头 ...
- Anaroid WebView 的属性汇总
1. 打开网页时不调用系统浏览器, 而是在本WebView中显示: mWebView.setWebViewClient(new WebViewClient(){ @Override public bo ...