n,m=map(int,input().split())
keys=[]
mask=1
if m&1:m-=1
else:
    print(-1)
    exit(0)
while m:
    if mask<=n:
        if m&1:keys.append(mask)
    else:
        print(-1)
        exit(0)
    mask<<=1
    m>>=1
#keys.append(n)
ans=[*range(1,n+1)]

idx=0
for i in keys:
    ans[idx],ans[i-1]=ans[i-1],ans[idx]
    idx+=1
print(*ans)
print(len(keys)+1)
for idx in range(1,idx+1):
    print(idx,idx)
if idx+1<=n:print(idx+1,n)

一道有意思的构造题

首先如果m是偶数,一定不可以,因为对区间每个值gcd最后肯定会有1作为结果

其余可以从二进制每一位考虑,如果最高位比排列最大值还要大,肯定不可以

对于m的每一位,从排列中选出与每一位转换成十进制相等的单个数作为一个区间,

其余数作为一个区间,gcd为1

例如

m=7=(111)

需要一个4(100),一个2(10),其余的所有数凑成1

然后交换顺序,把关键数字依次在开头排好