求正整数中第K个二制中不含11的数

本文介绍了一种算法,用于找出第K个不含连续11子串的二进制字符串。通过动态规划确定目标串长度,并递归生成具体字符串。

描述很简单:把所有的正整数从小到大都转化成二进制串,求第K(K<900000000)个不含11子串的二制串。如:1,2,3,4,5的二进制串为1,10,11,100,101,故前四个满足条件的串分别为1,10,100,101。

首先最想知道的就是第K个满足上述条件的串有多少位?1位的串有1个,2位的串有1个,3位的中有2个……其实我们发现可以构造出来。对于长度为N的串,对于这些串如果尾数为0,那么在后面增加0,1都可以;如果尾数为1,那么就只能增加0。这样就包含了所有的满足条件的长度为N+1的串。下面给出简单的证明:

由于N+1长的串是满足条件的,必然所有的N+1长的串的前N个字符组成的子串必然要满足条件,故前N个字符的子串的形式必定有所有长为N的串。得到了所有长为N+1串的前N个字符的串,只能在后面增加0或1,对于串尾为0,增加0,1后满足条件,对于串尾为1,必然只能增加0。故得证。如下图所示:

 

这样通过动态规划就可以求得长度为N的串一共有多少个,于是也就求得第K个满足条件的串的长度为多少。

然而这样还不够,我们只是知道了这样的串长为多少,我们并不知道这样的串是什么。那么怎么样得生成我们需要的串呢?如需求第7个满足条件的串的是多少。首先可以得到长度为4(从上图可看出来)。比4小的串有多少个呢?1,10,100,101,又可以得到第7个满足条件的串必然在长度为4的串中排第三(1000,1001,1010)。那么长度为4排第三的串又是多少呢?0,1,10……这样往下我们发现,问题转化为更小的,第2个满足条件的串是多少……以些类推,最终就可以求得解。

# P10510 进 ## 题目背景 为了提供更加良好的区分度,相较于蓝桥杯国赛,本场比赛的所有程序设计题添加了额外样例,请在附件处下载。 其中,后缀名为 $\bf{.in}$ 的文件为输入文件,$\bf{.out}$ 的文件为输出文件。您可以使用这些额外样例检验自己的程序正确性。但我们保证通过额外样例一定能取得您期望的分。 此外,我们提供了相较蓝桥杯国赛更多档的部分分,以确保分分布更为科学合理。 ## 题目描述 小洛正在学习三进。他定义三进为每一位只包括 $0,1,2$ 三种的**无穷长的**字串 $a$。 与一般的三进同的是,小洛的三进从左往右书写。例如,在常规表述下,$4$ 的三进表示为 $(0000\ 0011)_3$,而在小洛的三进表示下为 $(1100\ 0000 \cdots)_3$。 小洛特别喜欢从 $0$ 开始计,因此他规定三进的第 $0$ 位为最左侧的那一位。 下表给出了小洛的三进表示下,字 $37$ 的最低的 $8$ 位位以及位权: | 三进表示 | $1$ | $0$ | $1$ | $1$ | $0$ | $0$ | $0$ | $0$ | | :----------: | :----------: | :----------: | :----------: | :----------: | :----------: | :----------: | :----------: | :----------: | | 位 | $0$ | $1$ | $2$ | $3$ | $4$ | $5$ | $6$ | $7$ | | 位权 | $3^0$ | $3^1$ | $3^2$ | $3^3$ | $3^4$ | $3^5$ | $3^6$ | $3^7$ | 现在小洛有一个十进正整数 $V$(显然,需要将其转化为小洛的三进表示),并给定三种操作: - 操作一,将第 $i$ 位上的进行操作:$0$ 变为 $1$,$1$ 变为 $2$,$2$ 变为 $0$。 - 操作,将第 $i$ 位上的进行操作:$0$ 变为 $2$,$1$ 变为 $0$,$2$ 变为 $1$。 - 操作三,将第 $i$ 位上的进行操作:$1$ 变为 $2$,$2$ 变为 $1$,$0$ 变。 小洛一共要进行 $q$ 次操作。每次操作后,小洛需要得到三进串代表的值。请你告诉他。 如果对题意有清晰之处,请查看样例解释。 ## 输入格式 第一行输入两个正整数 $V,q$。 接下来 $q$ 行,每行一个操作,形如 `op i`。 请注意,你需要将 $V$ 转化为三进串并作为初始的三进串。 ## 输出格式 输出共 $q$ 行,第 $i$ 行表示第 $i$ 个操作后的答案。 ## 输入输出样例 #1 ### 输入 #1 ``` 4 3 1 1 2 0 1 2 ``` ### 输出 #1 ``` 7 6 15 ``` ## 说明/提示 **【样例解释】** 初始时,$V=4$,转化为小洛的三进为 $\texttt{1100 0000} \cdots$,接下来进行了 $3$ 次操作: - 将第 $1$ 位上的位从 $1$ 变为 $2$,三进变为 $\texttt{1200 0000} \cdots$,十进下为 $7$。 - 将第 $0$ 位上的位从 $1$ 变为 $0$,三进变为 $\texttt{0200 0000} \cdots$,十进下为 $6$。 - 将第 $2$ 位上的位从 $0$ 变为 $1$,三进变为 $\texttt{0210 0000} \cdots$,十进下为 $15$。 **【据范围】** - 对于 $30\%$ 的据,保证 $V\leq 10^9$。 - 对于另外 $30\%$ 的据,保证不含操作三。 对于所有据,保证 $0\leq V\leq 10^{18}$,$1\leq q\leq 10^5$,任意获取到的答案超过 $2\times 10^{18}$。用C++
最新发布
12-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值