1394: 有趣的数字

内存限制:128 MB 时间限制:1.000 S 标准输入输出
题目类型:传统 评测方式:文本比较 上传者:
提交:7 通过:3 通过率:42.857%

题目描述

(如果知道二进制,可以跳过这一部分,直接听题)

各位同学知道二进制是什么吗?
二进制是一种以2为基数的计数系统,通常用两个不同的符号0和1来表示。二进制与十进制有如下转换关系


在这里,我仅介绍一种将十进制转化为二进制的方法:

十进制转二进制可以用除2取余法来进行。这个方法的步骤是不断将十进制数除以2,记录每次的余数,直到结果为0。然后,将余数从下往上排列,得到二进制表示。

转换步骤

\1. 将十进制数除以2,得到一个商和余数。

\2. 将商继续除以2,再记录余数。

\3. 重复步骤,直到商为0。

\4. 将所有余数从最后一个到第一个排列起来,得到二进制结果。

示例

以十进制数18为例:

\1. 18 ÷ 2 = 9,余数 0

\2. 9 ÷ 2 = 4,余数 1

\3. 4 ÷ 2 = 2,余数 0

\4. 2 ÷ 2 = 1,余数 0

\5. 1 ÷ 2 = 0,余数 1

从下往上排列余数,结果是 10010。

所以,十进制的18在二进制中表示为 10010。

而二进制有自己的计算逻辑,这里仅介绍需要用到的这种:按位或。

当多个二进制数进行按位或时,依次对比每一位数,只要任意一个数这一位是“1”,这一位的结果就是“1”,反之则是“0”。

例如:10,12,16这三个数做按位或。

我们知道10的二进制数是01010,12的二进制数是01100,16的二进制数是10000

就有下面这个计算

01010 (10) |

01100 (12) |

10000(16)

--------- 

11110(30)  

所以这三个数按位或的结果为30。

现在,请听题。Ayin有一个无限长的自然数字串,也就是1,2,3,4,5,6,7,8,9......,他需要进行若干次操作来得到一个新的数字串。具体操作如下:

对于除了第一位的数字,其他所有数字和它两侧的数字做按位或运算,运算结果放在这个数字原位,也就是在第一次操作中,2需要和1,3做按位或,结果为3,那么新数字串的第二位就是3。

对于第一个数字,它只与它右边的一个数字做按位或运算,也就是在第一次操作中,1只需要和2做按位或,结果为3,那么新数字串的第一位也是3。

那么我们很容易知道,在进行一次操作后,数字串会变成3, 3, 7, 7, 7, 7, 7, 15, 15, 11, 15, 15, 15, 15, 15, ...两次操作后,数字串为3, 7, 7, 7, 7, 7, 15, 15, 15, 15, 15, 15, 15, 15, 15, ...


现在你需要回答的是在进行x次操作后,第y位数是什么(十进制输出)

输入格式

输入两个数n, m
第一个代表多少次操作
第二个我需要你输出操作后第m位的数。

输出格式

输出一个数,代表在进行若干次操作后,第m位的数

输入样例 复制

2 4

输出样例 复制

7