#CF1909E. 多灯
多灯
E. 多重灯
每个测试的时间限制:3 秒
内存限制:256 兆字节
你有 盏灯,编号从 到 。初始时,所有灯都处于关闭状态。
你还有 个按钮。第 个按钮会切换所有编号是 的倍数的灯的状态(即:如果灯是关的则打开,如果是开的则关闭)。
你需要根据以下规则按下一些按钮:
- 你必须按下至少一个按钮。
- 你不能重复按下同一个按钮。
- 给定 对 。如果你按下了按钮 ,则你也必须按下按钮 (可以在任意时刻,不一定在按下 之后)。注意,如果你按下了按钮 ,并不需要按下按钮 。
你希望不要浪费太多电。请找出一组按下的按钮,使得最终亮着的灯的数量不超过 ;如果不可能,输出 。
输入格式
每个测试包含多个测试用例。第一行包含整数 ()——测试用例的数量。接下来是每个测试用例的描述:
- 第一行包含两个整数 和 (,)——灯的数量以及约束对的数量。
- 接下来 行,每行包含两个整数 (,)。如果按下了按钮 ,则也必须按下按钮 。保证所有的 互不相同。
保证所有测试用例的 之和以及 之和均不超过 。
输出格式
对于每个测试用例:
- 如果不存在任何按按钮的方案使得最终亮着的灯数不超过 ,则输出一行包含 。
- 否则,输出两行:第一行包含一个整数 ()——按下的按钮数量;第二行包含 个整数 ()——按下的按钮的编号(顺序任意)。这些 必须互不相同,并且最终亮着的灯的数量不得超过 。
样例输入
4
4 0
5 2
4 1
5 1
15 9
7 8
8 9
9 10
10 9
11 1
12 2
13 3
14 4
15 5
5 4
1 2
2 3
3 4
4 5
样例输出
-1
4
3 5 1 2
3
8 9 10
1
5
样例解释
第一个测试用例:你需要使最终亮着的灯数不超过 ,即没有灯可以亮。可以证明,不存在任何至少按下一个按钮的方案使得最终亮着的灯数为 。
第二个测试用例:你可以按下按钮 。
- 初始所有灯关闭;
- 按下按钮 :切换编号为 的倍数的灯(即灯 ),所以灯 亮;
- 按下按钮 :切换编号为 的倍数的灯(即灯 ),所以灯 、 亮;
- 按下按钮 :切换编号为 的倍数的灯(即灯 ),所以灯 亮;
- 按下按钮 :切换编号为 的倍数的灯(即灯 ),所以灯 亮。
该方案合法,因为:
- 你至少按了一个按钮;
- 每个按钮最多按一次;
- 你按了按钮 ,则也必须按按钮 ,而按钮 确实被按了;
- 最终只有灯 亮。
第三个测试用例:按下按钮 只会使灯 亮。