51Nod 1668 非010串
这是昨天上课ChesterKing dalao讲线代时的例题
当时看到这道题就觉得很水,记录一下后面两位的情况然后讨论一下转移即可
由于之前刚好在做矩阵题,所以常规的矩阵快速幂优化也很简单
好我们开始看题目
首先很容易考虑到所有的情况只和最后两位有关,所以我们设a,b,c,d表示结尾为10,11,01,00的方案数,然后每一次增加位数,都有新的a',b',c'd'这转移为:
a'=a
b'=b+c
c'=a+d
d'=a+d
然后这个就是尿性的矩阵优化了,我们可以稍加分析得出递推矩阵:
1 0 0 0
0 1 1 0
1 0 0 1
1 0 0 1
然后矩阵快速幂求之即可
CODE
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
const int N=5,mod=1e9+7;
LL n;
struct Matrix
{
int n,m;
LL a[N][N];
inline void Dt_init(void)
{
n=m=4; memset(a,0,sizeof(a));
a[1][2]=a[2][2]=a[2][3]=a[3][1]=a[3][4]=a[4][1]=a[4][4]=1;
}
inline void cri_init(void)
{
n=m=4; memset(a,0,sizeof(a));
a[1][1]=a[2][2]=a[3][3]=a[4][4]=1;
}
inline LL get_sum(void)
{
LL ans=0;
for (register int i=1;i<=n;++i)
for (register int j=1;j<=m;++j)
ans=(ans+a[i][j])%mod;
return ans;
}
};
inline Matrix mul(Matrix A,Matrix B)
{
Matrix C; C.n=A.n; C.m=B.m; memset(C.a,0,sizeof(C.a));
for (register int i=1;i<=C.n;++i)
for (register int j=1;j<=C.m;++j)
for (register int k=1;k<=A.m;++k)
C.a[i][j]=(C.a[i][j]+A.a[i][k]*B.a[k][j])%mod;
return C;
}
inline Matrix quick_pow(Matrix A,LL p)
{
Matrix T; T.cri_init();
while (p)
{
if (p%2) T=mul(T,A);
A=mul(A,A); p/=2;
}
return T;
}
int main()
{
scanf("%lld",&n); Matrix A; A.Dt_init();
if (n==1) { puts("2"); return 0; }
if (n==2) { puts("4"); return 0; }
A=quick_pow(A,n-2);
printf("%lld",A.get_sum());
return 0;
}
51Nod 1668 非010串的更多相关文章
- 51nod 算法马拉松18 B 非010串 矩阵快速幂
非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...
- HDU 3485【101】 51nod 1668【010】 joj 2171【111】动态规划
有一个只含0和1的长度为n的串,问不含有101的所有串的个数. ——不存在连续的101.010.111的字符串数量 HDU:https://cn.vjudge.net/problem/HDU-3485 ...
- zoj 3228 覆盖及非覆盖串的多次匹配
题目题意: 给定多个小串,在一个长串中寻找这些串的匹配次数,有些统计的是可覆盖的,有些统计的是非覆盖的 先可以简单理解一下,建立ac自动机后,当前节点包含的字符串必然被把它作为fail指针的节点包含, ...
- 51Nod - 1154 回文串划分(最少回文串dp)
回文串划分 有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式. a|bb|aabaa - 3 个回文串 a|bb|a|aba|a - 5 个回文串 a|b ...
- 51nod 1154 回文串划分
1154 回文串划分 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有 ...
- 51NOD 1154 回文串的划分(DP)
思路:参考了网上,思路很清奇,借助vis[i][j]来表示从i到j是否为回文串,回文串这边是用的双重循环来写的:dp[i]用来表示以i结尾的字符串最少的回文串有多长. #include<cstr ...
- 51nod 1396 还是01串
给定一个0-1串s,长度为n,下标从0开始,求一个位置k,满足0<=k<=n, 并且子串s[0..k - 1]中的0的个数与子串s[k..n - 1]中1的个数相等. 注意: (1) 如果 ...
- 51nod 1391:01串
1391 01串 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 给定一个01串S,求出它的一个尽可能长的子串S[i. ...
- jsoncpp解析非json串
转自:https://www.cnblogs.com/huojing/articles/5927488.html 由于Jsoncpp解析非法json时,会自动容错成字符类型.对字符类型取下标时,会触发 ...
随机推荐
- loadrunner 结果分析-loadrunner结果分析
结果分析-loadrunner结果分析 by:授客 QQ:1033553122 百度网盘分享链接: 烦请 复制一下网址到浏览器中打开,输入密码提取 链接: http://pan.baidu.com/s ...
- MVC与单元测试实践之健身网站(七)-日程与打卡
上一篇完成了计划的制定,然后需要把计划转换为日程,在日历视图上直观地显示,与日程相对应的还有完成日程内容后的打卡动作. 一 日程视图 a) 要把循环的计划铺开成为日程,日程的显示用日历视图是最合适的. ...
- WRT 下 C++ wstring, string, String^ 互转
由于项目原因,需要引入C++. wstring 与 string 的互转研究了一段时间,坑主要在于使用下面这种方式进行转换,中文会乱码 wstring ws = L"这是一段测试文字&quo ...
- python并发编程之线程
操作系统线程理论 参考资料:http://www.cnblogs.com/Eva-J/articles/8306047.html 线程和python 理论知识 全局解释器锁GIL Python代码的执 ...
- 给 Linux 系统“减肥”,系统垃圾清理_系统安装与配置管理_Linux Today - Google Chrome
给 Linux 系统"减肥",系统垃圾清理 2013/10/16 linux 系统安装与配置管理 评论 15,555 Linux 计算机安装后,在我们不断的使用过程中,因 ...
- 洗礼灵魂,修炼python(37)--面向对象编程(7)—了解魔法方法
也许上一篇博文提到的property内置函数的用法你还觉得记忆犹新,那么有没有更多的类似的方法呢?有的,就是本篇文章要说的魔法方法 魔法方法 1.什么是魔法方法 (其实前面已经提到多次,每次我都是说暂 ...
- SQL Server自动备份存储过程和视图的方法
1 建立备份数据表 CREATE TABLE [dbo].[ProcBackup]( ,) NOT NULL, [name] [sysname] NOT NULL, ) NULL, [obj_id] ...
- python TCP socket套接字编程以及注意事项
TCPServer.py #coding:utf-8 import socket #s 等待链接 #c 实时通讯 s = socket.socket(socket.AF_INET,socket.SOC ...
- leetcode 5. Longest Palindromic Substring [java]
public String longestPalindrome(String s) { String rs = ""; int res = 0; for(int i = 0; i& ...
- hadoop系列 第一坑: hdfs JournalNode Sync Status
今天早上来公司发现cloudera manager出现了hdfs的警告,如下图: 解决的思路是: 1.首先解决简单的问题,查看警告提示的设置的阀值时多少,这样就可以快速定位到问题在哪了,果然Journ ...