3640: 教主的集合序列-训练套题T14T3

Memory Limit:512 MB Time Limit:2.000 S
Judge Style:Text Compare Creator:
Submit:0 Solved:1

Description

教主的集合序列(set.pas/c/cpp)

【问题描述】

定义集合S11n之间所有正整数组成的集合,即S1={1,2,3…n}。当k1时,Sk为集合Sk-1中任意两个不相同数之和的集合。

例如,当n=3时:

S1={1,2,3}

S2={3,4,5}

S3={7,8,9}

S4={15,16,17}

……   

现将每个集合中所有元素取出,集合Si的数放在集合Si+1的数的前面,同一个集合数从小到大排序,这样得到一个序列L。例如,当n=3时,L=1,2,3,3,4,5,7,8,9,15,16,17……

那么,现对于给定的nk,求L中第k个数。

【输入格式】

    输入包含1行,为2个正整数nk,两个整数用空格隔开。

【输出格式】

输出包含1行,为一个正整数,即序列L中第k个数。若这个数不存在,则输出-1

【样例输入】

4 6

【样例输出】

4

【样例说明】

n=4时,序列L=1,2,3,4,3,4,5,6,7,7……

  所以序列中第6个数为4

【数据规模】

  对于20%的数据,有k≤20

对于40%的数据,有k10000,n≤5

对于50%的数据,满足答案不超过2^31-1

对于60%的数据,有k2^30-1

对于80%的数据,有k≤10^100

对于100%的数据,有k10^10001n1000,对于n3有k≤90000

HINT

教主的集合序列(set)   高精度

显然每个集合中的数字都是连续的,所以可以用区间表示每个集合,第1个集合为[1,n]

若第k个集合为[a,b],长度为l=b-a+1,那么第k+1个集合为[2a+1, 2b-1],长度为(2b-1)-(2a+1)+1=2(b-a+1)-3=2l-3

由于当n<=3时,k<=90000,对于n>3时,集合的元素个数为指数级增长,所以第k个数不会出现在很后面的集合,所以高精度模拟每个集合即可,不断加上集合数字的个数,也要记录集合开头的数字,直到大于k为止。注意压位。

对于n=2需要特判。