Kevin翻硬币
题号:NC261524
时间限制:C/C++/Rust/Pascal 1秒,其他语言2秒
空间限制:C/C++/Rust/Pascal 256 M,其他语言512 M
Special Judge, 64bit IO Format: %lld

题目描述

\sf Take\ that\ money,\ and\ watch\ it\ burn

\sf Sink\ in\ the\ river,\ the\ lessons\ I’ve\ learned

       —— Counting\ Stars,\ \text{OneRepublic}
氧气少年n 枚硬币,他将这 n 枚硬币围成一圈,初始时所有硬币均为正面向上。

你每次可以进行下面的操作:
  • 选择连续的 k 枚硬币,将它们翻转一次。即:对于这 k 枚硬币中的每一枚硬币,如果该硬币目前正面向上,那它在操作后将变为反面向上,否则变为正面向上。

请判断能否经有限次操作使得所有硬币反面向上。如果能,请求出操作方案。

输入描述:

第一行包含一个整数 T(1\leq T\leq 2\cdot 10^5),表示测试用例的组数。

对于每组测试用例:

仅输入一行,包含两个整数 n(1\leq n\leq 2\cdot 10^5),k(1\leq k\leq n)

保证对于所有测试用例,n 的总和不超过 2\cdot 10^5

输出描述:

对于每组测试用例:

如果不能经有限次操作使得所有硬币反面向上,那么输出 -1

否则,第一行输出一个整数 m(0\leq m\leq 2\cdot n),表示操作的次数。
第二行包含 m 个整数,第 i 个整数 p_i(1\leq p_i\leq n) 表示第 i 次操作选择的连续 k 枚硬币中,第一枚硬币的位置。

可以证明,如果能经有限次操作使得所有硬币反面向上,那么一定有至少一种方案满足 m\leq 2\cdot n
请注意,你无需最小化操作次数。
如果有多个可行的答案,请输出任意一个。
示例1

输入

复制
2
6 3
3 2

输出

复制
2
1 4
-1