关闭

01字符串

标签: 编程
175人阅读 评论(0) 收藏 举报

【题目描述】
输出仅有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
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Java字符串与01串的转换

Java字符串与01串的互相转换
  • liuweiyuxiang
  • liuweiyuxiang
  • 2017-04-30 10:23
  • 829

字符串哈希函数

基本概念 所谓完美哈希函数,就是指没有冲突的哈希函数,即对任意的 key1 != key2 有h(key1) != h(key2)。 设定义域为X,值域为Y, n=|X|,m=|Y|,那么肯定有m...
  • wanglx2012
  • wanglx2012
  • 2014-10-20 14:37
  • 1791

经典算法面试题目-判断一个字符串中的字符是否唯一(1.1)

题目: Implement an algorithm to determine if a string has all unique characters. What if you can not ...
  • qq_26525215
  • qq_26525215
  • 2016-07-19 13:26
  • 1742

一个01字符串,求出现0、1出现次数相等的最长子串

题目描述:      已知一个长度为N的字符串,只由0和1组成, 求一个最长的子串,要求该子串出0和1出现的次数相等。      要求算法时间复杂度尽可能的低。      比如:  ...
  • majiakun1
  • majiakun1
  • 2015-10-08 09:07
  • 2491

基础练习2_01字串

/* 2.基础练习 01字串? 问题描述 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。 它们的前几个是: 00000 00001 00010 00011 00100 请按从小...
  • liubinzi123
  • liubinzi123
  • 2014-10-10 10:22
  • 2787

2014 图灵杯 问题 I: 反对称串

问题 I: 反对称串 时间限制: 5 Sec  内存限制: 16 MB 提交: 115  解决: 28 [提交][状态][讨论版] 题目描述   有一个字符串只有0和1组成,对于某个子串...
  • wangzhen_yu
  • wangzhen_yu
  • 2014-12-02 13:05
  • 497

ORACLE 基础知识以及基本函数

----------------今天是一年中的第几天,一个月中的第几天! SELECT trunc(sysdate,'dd') - to_date(to_char(sysdate,'yyyymm...
  • heqinghua217
  • heqinghua217
  • 2016-05-31 09:16
  • 173

给定一个01串(仅由‘ 0’或‘1’组成的字符串),现在想把这个数字串排序成“非递减”有序序列,请问至少需要多少次交换(任意两个位置交换)

给定一个01串(仅由‘ 0’或‘1’组成的字符串),现在想把这个数字串排序成“非递减”有序序列,请问至少需要多少次交换(任意两个位置交换)?  输入描述: 输入数据第一行是一个正整数T(T<=...
  • u010667082
  • u010667082
  • 2015-09-11 16:15
  • 1957

最通俗易懂的01背包问题讲解

1、动态规划(DP)  动态规划(Dynamic Programming,DP)与分治区别在于划分的子问题是有重叠的,解过程中对于重叠的部分只要求解一次,记录下结果,其他子问题直接使用即可,减少了重复...
  • FX677588
  • FX677588
  • 2017-04-02 14:02
  • 1391

01背包问题 总结关于为什么01背包优化成1维数组后,内层循环是逆序的?

    前言:本人是c语言初学者,能力有限,如果你比较强了,请忽略本文章。。,如果你能多给些指导,那更好啦.  我写这篇文章是因为我在偶然碰到了01背包的题目,而自己太菜,写不出来,于是在...
  • xiajiawei0206
  • xiajiawei0206
  • 2014-02-25 21:29
  • 1716
    个人资料
    • 访问:228237次
    • 积分:3666
    • 等级:
    • 排名:第10304名
    • 原创:176篇
    • 转载:22篇
    • 译文:0篇
    • 评论:18条
    个人主页
    www.jrxblog.top 欢迎访问&交换友链!
    博客专栏