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
然后交换顺序,把关键数字依次在开头排好

京公网安备 11010502036488号