01字符串
来源:互联网 发布:八爪鱼采集淘宝评论 编辑:程序博客网 时间:2024/05/21 15:46
【题目描述】
输出仅有0和1组成的长度为n的字符串,并且其中不能含有3个连续的相同子串。
【输入格式】
一行一个整数n表示有0和1组成的字符串的长度
【输出格式】
一行一个整数表示所有满足条件的字符串的个数,并对1000000007取模
【样例输入】
1
【样例输出】
2
【数据范围】
0<=n<=2^63-1
【分析】
比较直接的方法是直接枚举并判重,但是这种搜索的方法只能解决30以内的数据。多测试几个数据可以发现,其实这是一个斐波那契数列。但是只知道斐波那契还不够,递推爆时间,通项公式爆精度,故采用矩阵乘法+快速幂优化。
var i,j,k:longint; a,aa:array[1..10]of int64; t,tt,q,qq:array[1..10,1..10]of int64; z:int64;begin read(z); if z=0 then begin write(0);exit; end; if z=1 then begin write(2);exit; end; a[1]:=2;a[2]:=2;a[3]:=4; for i:=1 to 3 do t[i,i]:=1; q[1,1]:=0;q[1,2]:=0;q[1,3]:=0; q[2,1]:=1;q[2,2]:=0;q[2,3]:=1; q[3,1]:=0;q[3,2]:=1;q[3,3]:=1; z:=z-2; while z>0 do begin if z mod 2=1 then begin fillchar(tt,sizeof(tt),0); for i:=1 to 3 do for j:=1 to 3 do for k:=1 to 3 do tt[i,j]:=(tt[i,j]+t[i,k]*q[k,j]) mod 1000000007; t:=tt; end; fillchar(qq,sizeof(qq),0); for i:=1 to 3 do for j:=1 to 3 do for k:=1 to 3 do qq[i,j]:=(qq[i,j]+q[i,k]*q[k,j]) mod 1000000007; q:=qq; z:=z div 2; end; aa[1]:=0; for j:=1 to 3 do for k:=1 to 3 do aa[j]:=(aa[j]+a[k]*t[k,j]) mod 1000000007; write(aa[3]);end.
3 0
- 字符串-01~~~字符串-04
- 01字符串
- 01字符串
- 01字符串
- 01字符串
- 01字符串
- 01字符串
- 01字符串
- swit-字符串01-字符串重新认识
- 【python摘录01】字符串
- 【Wikioi】1065-01字符串
- 01左旋字符串
- 字符串01~04
- Codevs 1065 01字符串
- 蓝桥杯:01字符串
- Codevs 1065 01字符串
- Codevs 1065 01字符串
- python字符串(01)
- lua中关于时间的总结
- 网卡混杂模式介绍与设置
- bitcode的问题
- C++运算符重载
- gdb常用命令
- 01字符串
- android:clipToPadding和android:clipChildren
- android学习路线指南
- php文字水印和php图片水印实现代码
- Json数据的解析
- CNN卷积神经网络--反向传播(3,Notes on Convolutional Neural Networks)
- C/C++之多级指针和结构体
- 24. Swap Nodes in Pairs
- 属性动画