题意

  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)

  1. #include<stdio.h>
  2. #include<string.h>
  3. int k,m,t[]={,,,,};
  4. struct matrix
  5. {
  6. int a[][];
  7. int row,col;
  8. void init(int row,int col){
  9. this->row=row;
  10. this->col=col;
  11. memset(a,,sizeof(a));
  12. }
  13. }u;
  14. struct matrix b{
  15. {{,,,},
  16. {,,,},
  17. {,,,},
  18. {,,,}},
  19. ,
  20. };
  21. struct matrix c{
  22. {{},{},{},{}},
  23. ,
  24. };
  25. matrix mul(matrix a,matrix b)
  26. {
  27. matrix c;
  28. c.init(a.row,b.col);
  29. for(int i=; i<a.row; i++)
  30. for(int j=; j<b.col; j++)
  31. for(int k=; k<a.col; k++)
  32. c.a[i][j]=(c.a[i][j]%m+a.a[i][k]*b.a[k][j]%m)%m;
  33. return c;
  34. }
  35.  
  36. matrix qpow(matrix a,int k)
  37. {
  38. matrix ans;
  39. ans.init(a.row,a.col);
  40. for(int i=;i<a.row;i++)
  41. ans.a[i][i]=;
  42. while(k)
  43. {
  44. if(k&)ans=mul(ans,a);
  45. a=mul(a,a);
  46. k>>=;
  47. }
  48. return ans;
  49. }
  50.  
  51. int main()
  52. {
  53. while(~scanf("%d%d",&k,&m))
  54. {
  55. if(k>){u=mul(qpow(b,k-),c);
  56. printf("%d\n",u.a[][]%m);}
  57. else printf("%d\n",t[k]%m);
  58. }
  59. return ;
  60. }

奇怪的姿势一个个推,去掉两个mod就水过去了(AC)

  1. #include<stdio.h>
  2. int l,m,mm,mf,ff,fm,ta,tb,tc,td;
  3. int main()
  4. {
  5. while(~scanf("%d%d",&l,&m))
  6. {
  7. if(l==)printf("%d\n",%m);
  8. else if(l==)printf("0\n");
  9. else
  10. {
  11. mm=mf=fm=ff=;
  12. for(int i=; i<l; i++)
  13. {
  14. ta=mm;
  15. tb=mf;
  16. tc=fm;
  17. td=ff;
  18. mm=(tc+ta)%m;
  19. mf=ta;//mf=ta%m;
  20. fm=(tb+td)%m;
  21. ff=tb;//ff=tb%m;
  22. }
  23. printf("%d\n",(mm+mf+fm+ff)%m);
  24. }
  25. }
  26. return ;
  27. }

奇怪的姿势两个两个推(AC)

  1. #include<stdio.h>
  2. int l,m;
  3. int mm,mf,fm,ff;
  4. int mma,mfa,fma,ffa;
  5. int i;
  6. int main()
  7. {
  8. while(~scanf("%d%d",&l,&m))
  9. {
  10. if(l==)printf("0\n");
  11. else
  12. {
  13. if(l%){
  14. i=;
  15. mm=;mf=;fm=;ff=;
  16. }else{
  17. mm=mf=fm=ff=;
  18. i=;
  19. }
  20. for(; i<l; i+=)
  21. {
  22. mma=mm,mfa=mf,fma=fm,ffa=ff;
  23. mm=(mfa+ffa+fma+mma)%m;
  24. mf=(fma+mma)%m;
  25. fm=(mma+mfa)%m;
  26. ff=mma%m;
  27. }
  28. printf("%d\n",(mm+mf+fm+ff)%m);
  29. }
  30. }
  31. return ;
  32. }

漂亮的直接推(AC)

M(1 <= M <= 30) ,所以只在计算到大于一个比较大的数时才取模,这样可以减少取模的次数。这是参考了别人的代码。

  1. #include<stdio.h>
  2.  
  3. int l,m;
  4. int f[]={,,,,};
  5.  
  6. int main()
  7. {
  8. while(~scanf("%d%d",&l,&m))
  9. {
  10. for(int i=;i<=l;i++){
  11.  
  12. f[i]=f[i-]+f[i-]+f[i-];
  13.  
  14. if(f[i]>)
  15. f[i]%=m;
  16. }
  17. printf("%d\n",f[l]%m);
  18. }
  19. return ;
  20. }

【HDU 2604】Queuing的更多相关文章

  1. 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题

    [HDU  3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...

  2. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  3. -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】

    [把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...

  4. 【HDU 2196】 Computer(树的直径)

    [HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...

  5. 【HDU 2196】 Computer (树形DP)

    [HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...

  6. 【HDU 5145】 NPY and girls(组合+莫队)

    pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...

  7. 【hdu 1043】Eight

    [题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1043 [题意] 会给你很多组数据; 让你输出这组数据到目标状态的具体步骤; [题解] 从12345 ...

  8. 【HDU 3068】 最长回文

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...

  9. 【HDU 4699】 Editor

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [算法] 维护两个栈,一个栈放光标之前的数,另外一个放光标之后的数 在维护栈的同时求最大前缀 ...

随机推荐

  1. YOU ARE MY SUNSHINE

    /*you are sunshine, my only sunshine, you make me happy when skies are grey. you'll never know dear ...

  2. 纯CSS3制作卡通场景汽车动画效果

    前言 今天分享一下我昨晚做的CSS3动画效果——卡通场景汽车动画.在接触CSS3动画之前,我之前实现一些简单的动画效果都是使用flash完成的.但是自从CSS3横空出世,在移动端对CSS3动画的运用越 ...

  3. 各浏览器对typeof运算符的实现差异

    1,IE6/7/8中typeof运算符对BOM对象如window,document,location,history等对象的方法返回“object”,标准浏览器都返回“function”. 1 2 3 ...

  4. GIT 专贴

    1.官网 git-scm.com github.com 代码库 2.源码

  5. 【转】【C#】在 Windows 窗体 DataGridView 单元格中承载控件

    using System; using System.Windows.Forms; public class CalendarColumn : DataGridViewColumn { public ...

  6. [py] 导入模块 reload(sys)

        #!/usr/bin/env python # coding: utf-8 import sys   reload(sys) #<------这个是什么意思 sys.setdefault ...

  7. 在WebApi中实现Cors访问

    Cors是个比较热的技术,这在蒋金楠的博客里也有体现,Cors简单来说就是“跨域资源访问”的意思,这种访问我们指的是Ajax实现的异步访问,形象点说就是,一个A网站公开一些接口方法,对于B网站和C网站 ...

  8. python 调用 shell 命令方法

    python调用shell命令方法 1.os.system(cmd) 缺点:不能获取返回值 2.os.popen(cmd) 要得到命令的输出内容,只需再调用下read()或readlines()等   ...

  9. Objective-c基础学习

    核心内容 标识号 OC语言中,对各种变量,方法和类等要素命名时使用的字符序列称为标识符. OC标识符命名规则标识符由字母,下划线“_”,美元符号“$”和数字组成,标识符必须以字母,下划线,美元符号开头 ...

  10. Anaroid WebView 的属性汇总

    1. 打开网页时不调用系统浏览器, 而是在本WebView中显示: mWebView.setWebViewClient(new WebViewClient(){ @Override public bo ...