以下区间默认整数区间。
要求构造
[1,k)∪(k,n]。
若没有
k 的限制,可以在二进制下构造。具体地,构造出
20,21,22,…。在选取子序列的时候相当于枚举二进制的每一位选或不选,从而能构造出所有数。
对于
[1,k) ,相当于没有限制的情况下构造,设
d=⌊log2k⌋,则构造的序列为
{20,21,22,…,2d−1,k−2d}。加入
k−2d 是因为我们已经构造出了集合
S0=[1,2d),若此时添加一个数
y,钦定必须选
y,则新的集合为
S1={x∈N+∣x=y+p,p∈S0∪0},
y 可以不选,所以加入
y 后的集合为
S0∪S1。
构造出了
[1,k) 考虑如何构造
(k,n]。发现
[k,n] 中任何数都可以表示为
ak+b,其中
a∈N+,b∈[0,k)。但是
k 是我们不希望构造的,于是考虑先构造
(k,2k],再构造后面的
a′k+b,(a′∈[2,+∞]∪Z)。由上面的结论,加入
k+1 可以使能构造的集合变为
[1,k)∪(k,2k],此时只需要添加
2ik,i∈N+,直到
2ik≥n 即可。
为什么要构造
2ik?用
2i 是因为我们在构造
k 前面的系数
a,根据构造
[1,k) 时的操作,我们同样枚举
a 的二进制下的位数便可构造出连续的一段数字。
次数为
log2n 量级。