[atAGC045C]Range Set
首先我们可以把所有位置都变为1,因此不妨假设$a\le b$
一个字符串$s$合法当且仅当:将其中每一段长度不小于$a$的0变成1后,存在一段1的长度都不小于$b$
证明:我们称$S_{a,b}$为通过$(a,b)$能产生的字符串所构成的集合,则有$S_{a,b}=S_{b,a}$
称原来的字符串为$s$,将每一段长度不小于$a$的0变成1后称为$s'$,则若$s'\in S_{a,b}$则可以得到$s\in S_{a,b}$,同时若有$s\in S_{b,a}$又可以得到$s'\in S_{b,a}$,即可得$s\in S_{a,b}$等价于$s'\in S_{a,b}$
接下来,就是证明$s'\in S_{a,b}$当且仅当存在一段1的长度都不小于$b$
必要性:考虑$s'$中不存在一段0的长度不小于$a$,又不存在一段1的长度不小于$b$,对最后一次操作分类讨论即可(初始$n\ge a,b$,也满足条件)
充分性:将长度不小于$b$的一段1变为0,则若可以得到这个串则一定可以得到$s'$,然后由于$b\ge a$,再把这段0和左右两边原来的0合并起来,长度不小于$a$,根据上面的结论,可以将这一段变为1
重复此操作,每一次操作必然减少一段0,因此最终即所有位置都为1,显然可以做到
统计不合法的字符串数量,假设已经确定$s'$,去统计对应为$s'$的$s$数量,考虑dp
预处理出用$g_{l}$表示将这段1中若干个位置改为0,且每一段0的长度都不小于$a$的方案数,再用用$f_{i,0/1}$表示前$i$个数,第$i$个数为0或1,简单转移即可

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 5005
4 #define mod 1000000007
5 int n,a,b,ans,g[N],f[N][N];
6 int main(){
7 scanf("%d%d%d",&n,&a,&b);
8 if (a>b)swap(a,b);
9 for(int i=0;i<a;i++)g[i]=1;
10 for(int i=a;i<=n;i++){
11 g[i]=(g[i-1]+1)%mod;
12 for(int j=a;j<i;j++)g[i]=(g[i]+g[i-j-1])%mod;
13 }
14 f[0][0]=f[0][1]=1;
15 for(int i=1;i<=n;i++)
16 for(int j=0;j<i;j++)
17 if (i-j<b){
18 int l=i-j-2;
19 if (!j)l++;
20 if (i==n)l++;
21 f[i][1]=(f[i][1]+1LL*f[j][0]*g[max(l,0)])%mod;
22 if (i-j<a)f[i][0]=(f[i][0]+f[j][1])%mod;
23 }
24 ans=1;
25 for(int i=0;i<n;i++)ans=ans*2%mod;
26 ans=(ans+mod-(f[n][0]+f[n][1])%mod)%mod;
27 printf("%d",ans);
28 }
[atAGC045C]Range Set的更多相关文章
- SQL Server 合并复制遇到identity range check报错的解决
最近帮一个客户搭建跨洋的合并复制,由于数据库非常大,跨洋网络条件不稳定,因此只能通过备份初始化,在初始化完成后向海外订阅端插入数据时发现报出如下错误: Msg 548, Level 16, S ...
- Java 位运算2-LeetCode 201 Bitwise AND of Numbers Range
在Java位运算总结-leetcode题目博文中总结了Java提供的按位运算操作符,今天又碰到LeetCode中一道按位操作的题目 Given a range [m, n] where 0 <= ...
- [LeetCode] Range Addition 范围相加
Assume you have an array of length n initialized with all 0's and are given k update operations. Eac ...
- [LeetCode] Count of Range Sum 区间和计数
Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Ra ...
- [LeetCode] Range Sum Query 2D - Mutable 二维区域和检索 - 可变
Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...
- [LeetCode] Range Sum Query - Mutable 区域和检索 - 可变
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...
- [LeetCode] Range Sum Query 2D - Immutable 二维区域和检索 - 不可变
Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...
- [LeetCode] Range Sum Query - Immutable 区域和检索 - 不可变
Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...
- [LeetCode] Bitwise AND of Numbers Range 数字范围位相与
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers ...
随机推荐
- Java数据类型详解!Java秘诀,Java入门基础
Java的基本数据类型算是Java学习的基础之一,经常会听到大家提起.那么你到底有没有真正理解和掌握数据类型呢? Java 语言支持的数据类型分为两种:基本数据类型和引用数据类型!本文主要针对这两大数 ...
- redis在微服务领域的贡献
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 前言 说到redis,可能大家的脑海中蹦出的关键词是:NoSQL.KV.高性能.缓存等.但今天 ...
- 试题 算法训练 区间k大数查询 java题解
资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. 第二行包含n个正 ...
- IDA硬编码修改SO,重新打包APK绕过FRIDA反调试
该案例来自看雪 通过IDA修改SO 找到检测点 修改字符串 双击该字符串进入TEXT VIEW 选择 HEX VIEW 修改十六进制 右击EDIT 修改字符 右击 菜单栏-> edit -> ...
- Golang通脉之结构体
Go语言中的基础数据类型可以表示一些事物的基本属性,但是要表达一个事物的全部或部分属性时,这时候再用单一的基本数据类型明显就无法满足需求了,Go语言提供了一种自定义数据类型,可以封装多个基本数据类型, ...
- HCNP Routing&Switching之BGP防环机制和路由聚合
前文我们了解了BGP路由宣告相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15440860.html:今天我们来聊一聊BGP防环机制和路由聚合相关话题 ...
- LCP 07.传递消息
题目 小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下: 有 n 名玩家,所有玩家编号分别为 0 - n-1,其中小朋友 A 的编号为 0 每个玩家都有固定的若干个可传信息的其他玩家(也可 ...
- kivy画个半圆
from kivy.uix.boxlayout import BoxLayout from kivy.app import App class BoxLayoutWidget(BoxLayout): ...
- FastAPI 学习之路(五十四)startup 和 shutdown
我们在实际的开发中呢,总会遇到这样的场景,我们想在启动或者终止的时候,做一些事情,那么应该如何实现呢,其实也是很简单.fastapi提供了这样的操作. 那么我们看下具体是怎么实现的呢 app = Fa ...
- hdu 3038 How Many Answers Are Wrong(并查集)
题意: N和M.有N个数. M个回答:ai, bi, si.代表:sum(ai...bi)=si.如果这个回答和之前的冲突,则这个回答是假的. 问:M个回答中有几个是错误的. 思路: 如果知道sum( ...