非010串

基准时间限制:1 秒 空间限制:131072 KB 分值: 80
如果一个01字符串满足不存在010这样的子串,那么称它为非010串。

求长度为n的非010串的个数。(对1e9+7取模)
 
Input
  1. 一个数n,表示长度。(n<1e15)
Output
  1. 长度为n的非010串的个数。(对1e9+7取模)
Input示例
  1. 3
Output示例
  1. 7
  2.  
  3. 解释:
  4. 000
  5. 001
  6. 011
  7. 100
  8. 101
  9. 110
  10. 111

读完题,这样的题目肯定是能找到规律所在的,要不然数据太大根本无法算。假设现在给的长度是n,答案为f(n),那么假设最后一位是0,前面有010的可能就有f(n-1)种,同样假设最后一位是1,前面有010的可能就也有f(n-1),而这样排除的话还存在着一个问题,就是最后为0的时候可能会出现前面是01而构成010,这样就加重复了。所以假设前一位为1,再减去f(n-2),当然还可能前面是11而构成110而不是010,所以还要把多减的再加回来,即再加上一个f(n-3),这样一来就可以推出一个公式,f(n)=2*f(n-1)-f(n-2)+f(n-3)。看到这个公式,数据有那么大,所以我们用矩阵快速幂来进行处理就可以快速得出结果了。

下面是AC代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. using namespace std;
  6.  
  7. const long long mod=;
  8.  
  9. struct matrix
  10. {
  11. long long a[][];
  12. };
  13.  
  14. matrix cal(matrix A,matrix B)
  15. {
  16. int i,j,k;
  17. matrix C;
  18. for(i=;i<;i++)
  19. {
  20. for(j=;j<;j++)
  21. {
  22. C.a[i][j]=;
  23. for(k=;k<;k++)
  24. {
  25. C.a[i][j]=(C.a[i][j]+(A.a[i][k]*B.a[k][j])%mod+mod)%mod;
  26. }
  27. }
  28. }
  29. return C;
  30. }
  31.  
  32. int out(matrix A,matrix B)
  33. {
  34. cout<<"s:"<<endl;
  35. cout<<A.a[][]<<" "<<A.a[][]<<" "<<A.a[][]<<endl;
  36. cout<<A.a[][]<<" "<<A.a[][]<<" "<<A.a[][]<<endl;
  37. cout<<A.a[][]<<" "<<A.a[][]<<" "<<A.a[][]<<endl;
  38. cout<<"base:"<<endl;
  39. cout<<B.a[][]<<" "<<B.a[][]<<" "<<B.a[][]<<endl;
  40. cout<<B.a[][]<<" "<<B.a[][]<<" "<<B.a[][]<<endl;
  41. cout<<B.a[][]<<" "<<B.a[][]<<" "<<B.a[][]<<endl;
  42. return ;
  43. }
  44.  
  45. matrix pow_mod(long long x)
  46. {
  47. matrix s,base;
  48. base.a[][]=;
  49. base.a[][]=-;
  50. base.a[][]=;
  51. base.a[][]=;
  52. base.a[][]=base.a[][]=;
  53. base.a[][]=;
  54. base.a[][]=base.a[][]=;
  55. s.a[][]=;
  56. s.a[][]=;
  57. s.a[][]=;
  58. s.a[][]=s.a[][]=s.a[][]=;
  59. s.a[][]=s.a[][]=s.a[][]=;
  60. out(s,base);
  61. while(x)
  62. {
  63. if(x&)
  64. s=cal(s,base);
  65. base=cal(base,base);
  66. out(s,base);
  67. x>>=;
  68. }
  69. return s;
  70. }
  71.  
  72. int main()
  73. {
  74. long long n;
  75. long long ans;
  76. while(scanf("%lld",&n)!=EOF)
  77. {
  78. if(n==)
  79. cout<<<<endl;
  80. else if(n==)
  81. cout<<<<endl;
  82. else if(n==)
  83. cout<<<<endl;
  84. else if(n==)
  85. cout<<<<endl;
  86. else
  87. {
  88. matrix t=pow_mod(n-);
  89. ans=t.a[][]%mod;
  90. cout<<ans<<endl;
  91. /*cout<<t.a[0][1]%mod<<endl;
  92. cout<<t.a[1][0]%mod<<endl;
  93. cout<<t.a[1][1]%mod<<endl;*/
  94. }
  95. }
  96. return ;
  97. }

51nod 算法马拉松18 B 非010串 矩阵快速幂的更多相关文章

  1. 51nod 算法马拉松18 A 染色问题

    染色问题 基准时间限制:1 秒 空间限制:10240 KB 分值: 40 一个n(3<=n<=100)个点的完全图,现在给出n,要求将每条边都染上一种颜色k(1<=k<=n), ...

  2. 51NOD 算法马拉松8

    题目戳这里:51NOD算法马拉松8 某天晚上kpm在玩OSU!之余让我看一下B题...然后我就被坑进了51Nod... A.还是01串 水题..怎么乱写应该都可以.记个前缀和然后枚举就行了.时间复杂度 ...

  3. 51nod 算法马拉松 34 Problem D 区间求和2 (FFT加速卷积)

    题目链接  51nod 算法马拉松 34  Problem D 在这个题中$2$这个质数比较特殊,所以我们先特判$2$的情况,然后仅考虑大于等于$3$的奇数即可. 首先考虑任意一个点对$(i, j)$ ...

  4. 【BZOJ1009】GT考试(KMP算法,矩阵快速幂,动态规划)

    [BZOJ1009]GT考试(KMP算法,矩阵快速幂,动态规划) 题面 BZOJ 题解 看到这个题目 化简一下题意 长度为\(n\)的,由\(0-9\)组成的字符串中 不含串\(s\)的串的数量有几个 ...

  5. 算法设计与分析 1.2 不一样的fibonacci数列 (矩阵快速幂思想)

    题目描述 Winder 最近在学习 fibonacci 数列的相关知识.我们都知道 fibonacci 数列的递推公式是F(n) = F(n - 1) + F(n - 2)(n >= 2 且 n ...

  6. 51nod 1113 矩阵快速幂

    题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...

  7. 题解-AtCoder-agc003F Fraction of Fractal(非矩阵快速幂解法)

    Problem AtCoder-agc003F 题意:给出\(n\)行\(m\)列的01矩阵,一开始所有 \(1\) 连通,称此为\(1\)级分形,定义\(i\)级分形为\(i-1\)级分形中每个标示 ...

  8. 整数快速乘法/快速幂+矩阵快速幂+Strassen算法

    快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c  二.矩 ...

  9. FZU2018级算法第一次作业 1.1fibonacci (矩阵快速幂)

    题目 Winder最近在学习fibonacci 数列的相关知识.我们都知道fibonacci数列的递推公式是F(n)=F(n-1)+F(n-2)(n>=2 且n 为整数). Winder想知道的 ...

随机推荐

  1. Python 学习文章收藏

    作者 标题 rollenholt Python修饰器的函数式编程 - Rollen Holt - 博客园 rollenholt python操作gmail - Rollen Holt - 博客园 ro ...

  2. shell使用攻略

    shell 是什么 ~ $ ls /bin/*sh /bin/bash /bin/csh /bin/ksh /bin/sh /bin/tcsh /bin/zsh 是什么 kernel shell 命令 ...

  3. 当前不会命中断点。源代码与原始版本不同 (VS2012)

    遇到“当前不会命中断点.源代码与原始版本不同”的问题. 在网上查的类似: 一般studio会提示将“工具”,“选项”,“调试”,“要求源文件与原始版本完成匹配”去掉勾.但是这个配置去掉治标不治本,错误 ...

  4. EditText中imeOptions属性使用及设置无效解决

    虽然通常输入法软键盘右下角会是回车按键 但我们经常会看到点击不同的编辑框,输入法软键盘右下角会有不同的图标 点击浏览器网址栏的时候,输入法软键盘右下角会变成“GO”或“前往” 而我们点击Google搜 ...

  5. Sql Server系列:字符串函数

    字符串函数用于对字符和二进制字符串进行各种操作,大多数字符串函数只能作用于char.nchar.varchar和nvarchar数据类型.字符串函数可以用在SELECT或者WHERE语句中. 1. A ...

  6. SQL Server游标

    什么是游标 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作数据 ...

  7. 【转】WPF防止界面卡死并显示加载中效果

    原文地址:http://www.cnblogs.com/linyijia/archive/2013/02/06/2900609.html <Window x:Class="Loadin ...

  8. 我被比特币撞了一下腰——记OKCoin试用体验

    本博客还有大量的.NET开源技术文章,您可能感兴趣: 1.开源Math.NET基础数学类库使用系列文章:链接 2.开源C#彩票数据资料库系列文章:链接 3.开源的.NET平台ORM组件文章:链接 4. ...

  9. 基于Metronic的Bootstrap开发框架经验总结(5)--Bootstrap文件上传插件File Input的使用

    Bootstrap文件上传插件File Input是一个不错的文件上传控件,但是搜索使用到的案例不多,使用的时候,也是一步一个脚印一样摸着石头过河,这个控件在界面呈现上,叫我之前使用过的Uploadi ...

  10. 【续集】在 IIS 中部署 ASP.NET 5 应用程序遭遇的问题

    dudu 的一篇博文:在 IIS 中部署 ASP.NET 5 应用程序遭遇的问题 针对 IIS 部署 ASP.NET 5 应用程序的问题,在上面博文中主要采用两种方式尝试: VS2015 的 Publ ...