51nod 算法马拉松18 B 非010串 矩阵快速幂

非010串

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

求长度为n的非010串的个数。(对1e9+7取模)

Input
一个数n,表示长度。(n<1e15)
Output
长度为n的非010串的个数。(对1e9+7取模)
Input示例
3
Output示例
7解释:
000
001
011
100
101
110
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代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;const long long mod=1000000007;struct matrix
{long long a[3][3];
};matrix cal(matrix A,matrix B)
{int i,j,k;matrix C;for(i=0;i<3;i++){for(j=0;j<3;j++){C.a[i][j]=0;for(k=0;k<3;k++){C.a[i][j]=(C.a[i][j]+(A.a[i][k]*B.a[k][j])%mod+mod)%mod;}}}return C;
}int out(matrix A,matrix B)
{cout<<"s:"<<endl;cout<<A.a[0][0]<<" "<<A.a[0][1]<<" "<<A.a[0][2]<<endl;cout<<A.a[1][0]<<" "<<A.a[1][1]<<" "<<A.a[1][2]<<endl;cout<<A.a[2][0]<<" "<<A.a[2][1]<<" "<<A.a[2][2]<<endl;cout<<"base:"<<endl;cout<<B.a[0][0]<<" "<<B.a[0][1]<<" "<<B.a[0][2]<<endl;cout<<B.a[1][0]<<" "<<B.a[1][1]<<" "<<B.a[1][2]<<endl;cout<<B.a[2][0]<<" "<<B.a[2][1]<<" "<<B.a[2][2]<<endl;return 0;
}matrix pow_mod(long long x)
{matrix s,base;base.a[0][0]=2;base.a[1][0]=-1;base.a[2][0]=1;base.a[0][1]=1;base.a[1][1]=base.a[2][1]=0;base.a[1][2]=1;base.a[0][2]=base.a[2][2]=0;s.a[0][0]=7;s.a[0][1]=4;s.a[0][2]=2;s.a[1][0]=s.a[1][1]=s.a[1][2]=0;s.a[2][0]=s.a[2][1]=s.a[2][2]=0;out(s,base);while(x){if(x&1)s=cal(s,base);base=cal(base,base);out(s,base);x>>=1;}return s;
}int main()
{long long n;long long ans;while(scanf("%lld",&n)!=EOF){if(n==0)cout<<0<<endl;else if(n==1)cout<<2<<endl;else if(n==2)cout<<4<<endl;else if(n==3)cout<<7<<endl;else{matrix t=pow_mod(n-3);ans=t.a[0][0]%mod;cout<<ans<<endl;/*cout<<t.a[0][1]%mod<<endl;cout<<t.a[1][0]%mod<<endl;cout<<t.a[1][1]%mod<<endl;*/}}return 0;
}

posted on 2016-09-29 18:21 暖黑色 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lmhbk/p/5919666.html

51nod 算法马拉松18 B 非010串 矩阵快速幂相关推荐

  1. 蓝桥杯 算法提高 递推求值(矩阵快速幂)详解

    传送门 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3 ...

  2. 51nod 1836战忽局的手段(期望+矩阵快速幂)

    战忽局的手段 n n n个事件, m m m次演讲 定义 d p [ i ] dp[i] dp[i]为 i i i次演讲的期望次数 d p [ 1 ] = 1 dp[1]=1 dp[1]=1 d p ...

  3. 51nod 1836 战忽局的手段(期望+矩阵快速幂)

    众所周知,有一个神秘的组织--战忽局,在暗中保护着我们.在局中任职的官员都有着极强的忽悠技巧,不只能用预言,还能用往事忽悠人.如今某外星间谍已经获得了战忽局曾经参与的n次事件的资料,局座发现了这件事, ...

  4. mysql 矩阵运算_MySQL实现算法:矩阵快速幂

    前几日在地铁上和好友讨论起MySQL数据库,由于MySQL数据库不支持复合类型变量,就想到能否用MySQL去实现一些算法呢.最近在学习MySql存储程序,昨天闲来无事,就动手写写吧,借此巩固一下存储过 ...

  5. 杭电ACM-LCY算法进阶培训班-专题训练(矩阵快速幂)

    杭电ACM-LCY算法进阶培训班-专题训练(矩阵快速幂)[模板] 传送门 杭电ACM-LCY算法进阶培训班-专题训练(矩阵快速幂)[模板] 矩阵快速幂模板 Count Problem Descript ...

  6. 算法分类整理+模板①:矩阵快速幂

    一直有一个想法,感觉自己很多基础算法不是很扎实,想要找个机会写一些算法的整理,顺便自己总结一些实用的模板. 最近偶然在训练赛中连续做了2道思维+矩阵快速幂的题目,碰巧有时间,就以矩阵快速幂作为这个系列 ...

  7. 51nod 1113 矩阵快速幂

    1113 矩阵快速幂 基准时间限制:3 秒 空间限制:131072 KB 分值: 40  难度:4级算法题 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大 ...

  8. 矩阵快速幂(51nod)

    1113 矩阵快速幂 基准时间限制:3 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计算结果太大, ...

  9. 51nod 1113 矩阵快速幂 模板题

    1113 矩阵快速幂 基准时间限制:3 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 给出一个N * N的矩阵,其中的元素均为正整数.求这个矩阵的M次方.由于M次方的计 ...

最新文章

  1. c语言孩子兄弟法存储一棵树,数据结构(C语言版)---树
  2. RHEL/CentOS查看网卡的MAC地址
  3. 批量打印html文档,web页面的单页打印以及批量打印实现方法
  4. webgis 行政图报错_WebGIS 地图 示例源码下载
  5. Windows 环境 Jenkins集成构建SonarQube
  6. 利用可视化软件navicat查看表的sql语句
  7. HTML的DOM和浏览器的BOM
  8. 【英语学习】【医学】Unit 03 Blood
  9. 【英语学习】【WOTD】reverberate 释义/词源/示例
  10. 重新认识鸿鹄与燕雀的区别
  11. paip.python ide 总结最佳实践o4.
  12. 2019常用的几种编程语言的简单介绍和特点以及应用领域
  13. 基于AutoCAD自动数控编程工具NC_Manu_Tool(最新V1.39)
  14. 调用微信支付api实现用户扫描二维码支付订单
  15. 人工智能正在重塑人力资源的7种方式
  16. IDEA的插件,IDEA强大的插件库
  17. python的ide编辑器_python轻量IDE编辑器 pyscripter 免费开源 更新3.6.3版本
  18. 让梁大侠头疼的CPU段式结构的由来
  19. database changed是什么意思_itunes其他是什么 itunes其他清除方法介绍【图文教程】...
  20. html5 swf在线播放,html5怎样播放swf格式的视频

热门文章

  1. python手机版iphone-Python编程狮下载
  2. python基础教程pdf百度云-《Python基础教程(第3版)》PDF高清版
  3. python是干什么用的视频-python基础教程千锋最新视频学完之后可以做什么
  4. python好学吗mooc中文网-2020年大学mooc用Python玩转数据作业答案
  5. python中的time库安装步骤-Python time库基本操作方法
  6. monty python flying circus-巨蟒剧团之飞翔的马戏团 第1季
  7. python下载大文件-python-Django:允许用户下载大文件
  8. 以下哪个不是python中的关键字-以下不是python中的关键字
  9. python多线程爬虫实例-python支持多线程的爬虫实例
  10. python中可以用中文作为变量-Python中用中文变量名、函数名,会影响性能吗?