01字符串

【题目描述】
输出仅有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.

转载于:https://www.cnblogs.com/JRX2015U43/p/6533536.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值