76构造
时间限制:C/C++/Rust/Pascal 2秒,其他语言4秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
Special Judge, 64bit IO Format: %lld

题目描述

76 需要你构造一个长度为 n 的排列,并将其分割成 不多于 100 个 不相交的连续区间 ,使得每个区间的元素的 \gcd按位或起来等于整数 m
如果能构造,输出任意一种方案。
如果构造不了,输出 -1

输入描述:

输入两个整数 n,m\ (\ 1 \leq n,m \leq 10^5\ ) ,代表排列的长度和目标整数 。

输出描述:

如果无法构造,直接输出 -1
否则,按以下格式输出:
第一行输出一个长度为 n 的排列 。
第二行输出你想划分的区间数量 k
随后 k 行,每行输出两个整数 l,r ,表示区间的左右端点。
示例1

输入

复制
6 7

输出

复制
6 5 4 3 2 1
4
1 1
2 3
4 5
6 6

说明

1 组,\gcd=6
2 组,\gcd=1
3 组,\gcd=1
4 组,\gcd=1
按位或起来,为 7
示例2

输入

复制
3 2

输出

复制
-1

说明

可以证明,无论怎样分组,都凑不出 2
此处证明略。