非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=; struct matrix
{
long long a[][];
}; matrix cal(matrix A,matrix B)
{
int i,j,k;
matrix C;
for(i=;i<;i++)
{
for(j=;j<;j++)
{
C.a[i][j]=;
for(k=;k<;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[][]<<" "<<A.a[][]<<" "<<A.a[][]<<endl;
cout<<A.a[][]<<" "<<A.a[][]<<" "<<A.a[][]<<endl;
cout<<A.a[][]<<" "<<A.a[][]<<" "<<A.a[][]<<endl;
cout<<"base:"<<endl;
cout<<B.a[][]<<" "<<B.a[][]<<" "<<B.a[][]<<endl;
cout<<B.a[][]<<" "<<B.a[][]<<" "<<B.a[][]<<endl;
cout<<B.a[][]<<" "<<B.a[][]<<" "<<B.a[][]<<endl;
return ;
} matrix pow_mod(long long x)
{
matrix s,base;
base.a[][]=;
base.a[][]=-;
base.a[][]=;
base.a[][]=;
base.a[][]=base.a[][]=;
base.a[][]=;
base.a[][]=base.a[][]=;
s.a[][]=;
s.a[][]=;
s.a[][]=;
s.a[][]=s.a[][]=s.a[][]=;
s.a[][]=s.a[][]=s.a[][]=;
out(s,base);
while(x)
{
if(x&)
s=cal(s,base);
base=cal(base,base);
out(s,base);
x>>=;
}
return s;
} int main()
{
long long n;
long long ans;
while(scanf("%lld",&n)!=EOF)
{
if(n==)
cout<<<<endl;
else if(n==)
cout<<<<endl;
else if(n==)
cout<<<<endl;
else if(n==)
cout<<<<endl;
else
{
matrix t=pow_mod(n-);
ans=t.a[][]%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 ;
}

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. [SDK2.2]Windows Azure Storage (16) 使用WCF服务,将本地图片上传至Azure Storage (上) 客户端代码

    <Windows Azure Platform 系列文章目录> 前一章我们完成了服务器端的代码,并且已经发布到了Windows Azure云端. 本章我们将实现客户端的代码,客户端这里我们 ...

  3. Java Collections.sort方法对list集合排序

    1.排序测试类 package com.ljq.test; import java.util.ArrayList; import java.util.Collections; import java. ...

  4. 《Entity Framework 6 Recipes》中文翻译系列 (31) ------ 第六章 继承与建模高级应用之自引用关联

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-4  使用TPH建模自引用关系 问题 你有一张自引用的表,它代表数据库上不同类型 ...

  5. SQL语句全

    创建数据库 创建之前判断该数据库是否存在 if exists (select * from sysdatabases where name='databaseName') drop database ...

  6. Linux更改用户密码

    登录虚拟机后,使用passwd密令更改用户密码,新密码需要输入两次才能更改成功.不多说,直接上代码 [root@localhost Desktop]# passwd //使用passwd密令 Chan ...

  7. angularjs揭秘

    angularjs揭秘

  8. jQuery第二篇 (帅哥)

    1.1 jQuery操作DOM jQuery课程的目标:学会使用jQuery设计常见效果 选择器 基本选择器:#id ..class .element.* . 层级选择器: 空格.>.+.~ 基 ...

  9. 使用 fixed role 授予权限

    今天下午,Leader 发mail给我,要求授予某个User对数据库只读的权限. Step1,在SQL Server中为该用户创建一个Login和User,在创建User时,建立Login 和 Use ...

  10. 实战MEF(3):只导出类的成员

    通过前面两篇文章的介绍,相信各位会明白MEF中有不少实用价值.上一文中我们也讨论了导入与导出,对于导出导入,今天我们再深入一点点,嗯,只是深入一点点而已,不会很难的,请大家务必放心,如果大家觉得看文章 ...