非010串

非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

思路:矩阵快速幂;

末尾的状态可以看成是01,10,11,00四种状态,那么考虑新加入的是0,和1,进行状态转移,最后矩阵快速幂求解。
  1 #include<stdio.h>
  2 #include<algorithm>
  3 #include<iostream>
  4 #include<string.h>
  5 #include<queue>
  6 #include<stack>
  7 #include<math.h>
  8 using namespace std;
  9 typedef long long LL;
 10 typedef struct node
 11 {
 12         LL m[4][4];
 13         node()
 14         {
 15                 memset(m,0,sizeof(m));
 16         }
 17 } maxtr;
 18 const int mod = 1e9+7;
 19 maxtr E();
 20 void Init(maxtr *p);
 21 maxtr quick_m(maxtr ans,LL m);
 22 int main(void)
 23 {
 24         LL n;
 25         scanf("%lld",&n);
 26         if(n == 1)
 27                 printf("2\n");
 28         else if(n == 2)
 29                 printf("4\n");
 30         else
 31         {
 32                 n-=2;
 33                 maxtr ak;
 34                 Init(&ak);
 35                 maxtr ask = quick_m(ak,n);
 36                 LL sum = 0;
 37                 int i ,j;
 38                 for(i = 0; i < 4; i++)
 39                 {
 40                         for(j = 0; j < 4; j++)
 41                         {      //printf("%lld\n",ak.m[i][j]);
 42                                 sum = sum+ask.m[i][j];
 43                                 sum%=mod;
 44                         }
 45                 }
 46                 printf("%lld\n",sum);
 47         }
 48         return 0;
 49 }
 50 maxtr E()
 51 {
 52         maxtr e;
 53         int i,j;
 54         for(i = 0; i < 4; i++)
 55         {
 56                 for(j = 0; j < 4; j++)
 57                 {
 58                         if(i == j)
 59                                 e.m[i][j] = 1;
 60                         else e.m[i][j] = 0;
 61                 }
 62         }return e;
 63 }
 64 void Init(maxtr *p)
 65 {
 66         memset(p->m,0,sizeof(p->m));
 67         p->m[0][0] = 1;
 68         p->m[0][2] = 1;
 69         p->m[1][0] = 1;
 70         p->m[1][2] = 1;
 71         p->m[2][3] = 1;
 72         p->m[3][1] = 1;
 73         p->m[3][3] = 1;
 74 }
 75 maxtr quick_m(maxtr ans,LL m)
 76 {
 77         maxtr C = E();
 78         while(m)
 79         {
 80                 if(m&1)
 81                 {
 82                         maxtr dp;
 83                         for(int i = 0; i < 4; i++)
 84                         {
 85                                 for(int j = 0; j < 4; j++)
 86                                 {
 87                                         for(int s = 0; s < 4; s++)
 88                                         {
 89                                                 dp.m[i][j] = dp.m[i][j] + ans.m[i][s]*C.m[s][j]%mod;
 90                                                 dp.m[i][j] %= mod;
 91                                         }
 92                                 }
 93                         }
 94                         C = dp;
 95                 }
 96                 maxtr ak;
 97                 for(int i = 0; i < 4; i++)
 98                 {
 99                         for(int j = 0; j < 4; j++)
100                         {
101                                 for(int s = 0; s < 4; s++)
102                                 {
103                                         ak.m[i][j] = ak.m[i][j] + ans.m[i][s]*ans.m[s][j]%mod;
104                                         ak.m[i][j]%=mod;
105                                 }
106                         }
107                 }
108                 ans = ak;
109                 m/=2;
110         }
111         return C;
112 }
				
时间: 2024-10-20 07:08:12

非010串的相关文章

51nod 算法马拉松18 B 非010串 矩阵快速幂

非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 读完题,这样的题目肯定是能找到规律所在的,要不然数据太大根本无法算.假设现在给的

求两个串的最大子序列(非字串)

问题:求两个串的最大子序列(并非连接的) Java代码: import java.util.Set; import java.util.StringJoiner; public class Main { public static int getL(String a, String b) { if (a.isEmpty()||b.isEmpty()) return 0; if (a.charAt(0) == b.charAt(0)) return getL(a.substring(1), b.s

Codeforces Round #581 (Div. 2)D(思维,构造,最长非递减01串)

#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;char s[100007];int main(){ cin>>s+1; int n=strlen(s+1); int cnt=0; for(int i=n;i>=1;--i){//从后向前,保证后面的解都是合法的情况下 if(s[i]=='1'){//如果当前位置的数字是1 if(cnt)//i后面1的个数小于0的个数,此时如果把i位

hdu 2197 求长度为n的本原串 快速幂+map

Problem Description由0和1组成的串中,不能表示为由几个相同的较小的串连接成的串,称为本原串,有多少个长为n(n<=100000000)的本原串?答案mod2008.例如,100100不是本原串,因为他是由两个100组成,而1101是本原串. Input输入包括多个数据,每个数据一行,包括一个整数n,代表串的长度. Output对于每个测试数据,输出一行,代表有多少个符合要求本原串,答案mod2008. Sample Input1234 Sample Output22612 长

HDU - 2197 本原串

Description 由0和1组成的串中,不能表示为由几个相同的较小的串连接成的串,称为本原串,有多少个长为n(n<=100000000)的本原串? 答案mod2008. 例如,100100不是本原串,因为他是由两个100组成,而1101是本原串. Input 输入包括多个数据,每个数据一行,包括一个整数n,代表串的长度. Output 对于每个测试数据,输出一行,代表有多少个符合要求本原串,答案mod2008. Sample Input 1 2 3 4 Sample Output 2 2 6

本原串(HDU 2197 快速幂)

本原串 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1091    Accepted Submission(s): 350 Problem Description 由0和1组成的串中,不能表示为由几个相同的较小的串连接成的串,称为本原串,有多少个长为n(n<=100000000)的本原串?答案mod2008.例如,100100不是本原

Gym 100712L Alternating Strings II(单调队列)

题目链接 Alternating Strings II 题意是指给出一个长度为n的01串,和一个整数k,要求将这个01串划分为很多子串(切很多刀),使得每个子串长度不超过k,且每个字串不是01交替出现的串(例如01, 10, 101, 010, 101010这些都是01交替出现的串),求最少需要切多少次 令F[i]代表前i个数所需要切的最少的刀数(从1开始计数),那么有 F[i]  = min{F[j] | |j + 1, i| <= k 且 [j, i]这个子串不是01交替出现的串} + 1

leetcode -day29 Binary Tree Inorder Traversal &amp; Restore IP Addresses

1.  Binary Tree Inorder Traversal Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [1,3,2]. Note: Recursive solution is trivial, could you do it iteratively? 分析:求二叉树的中序

文本处理工具--正则表达式

在学习linux中文本搜索是很重要的 对于初学者来说如何快速学会运用正则表达式相当重要的. 文本搜索工具,根据用户指定的文本搜索模式(搜索条件)对目标进行逐行搜索,显示能匹配的行. 文本搜索: grep :基本正则表达式 egrep:扩展正则表达式 fgrep:fast,不支持使用正则表达式 其语法格式: grep [option]...'PATTERN' FILE... 正则表达式:是一类字符所书写的模式,其中许多字符不表示其字面意义,而是表达控制或通配等能: 元字符:不表示其字面意义,而用于