You are given a set of n n n ( n n n is always a power of 2 2 2) elements containing all integers 0 , 1 , 2 , … , n ? 1 0, 1, 2, \ldots, n-1 0,1,2,…,n?1 exactly once.
Find n 2 \frac{n}{2} 2n? pairs of elements such that:
If there are many solutions, print any of them, if there is no solution, print ? 1 -1 ?1 instead.
The input consists of multiple test cases. The first line contains a single integer t t t ( 1 ≤ t ≤ 400 1 \leq t \leq 400 1≤t≤400) — the number of test cases. Description of the test cases follows.
Each test case consists of a single line with two integers n n n and k k k ( 4 ≤ n ≤ 2 16 4 \leq n \leq 2^{16} 4≤n≤216, n n n is a power of 2 2 2, 0 ≤ k ≤ n ? 1 0 \leq k \leq n-1 0≤k≤n?1).
The sum of n n n over all test cases does not exceed 2 16 2^{16} 216. All test cases in each individual input will be pairwise different.
For each test case, if there is no solution, print a single line with the integer ? 1 -1 ?1.
Otherwise, print n 2 \frac{n}{2} 2n? lines, the i i i-th of them must contain a i a_i ai? and b i b_i bi?, the elements in the i i i-th pair.
If there are many solutions, print any of them. Print the pairs and the elements in the pairs in any order.
4
4 0
4 1
4 2
4 3
0 3
1 2
0 2
1 3
0 1
2 3
-1
In the first test, ( 0 & 3 ) + ( 1 & 2 ) = 0 (0\&3)+(1\&2) = 0 (0&3)+(1&2)=0.
In the second test, ( 0 & 2 ) + ( 1 & 3 ) = 1 (0\&2)+(1\&3) = 1 (0&2)+(1&3)=1.
In the third test, ( 0 & 1 ) + ( 2 & 3 ) = 2 (0\&1)+(2\&3) = 2 (0&1)+(2&3)=2.
In the fourth test, there is no solution.
给你一个由 n n n ( n n n 总是 2 2 2 的幂次)元素组成的集合,其中包含所有整数 0 , 1 , 2 , … , n ? 1 0, 1, 2, \ldots, n-1 0,1,2,…,n?1 恰好一次。
请找出 n 2 \frac{n}{2} 2n? 对元素,使得:
如果有多个解,则打印任意一个;如果没有解,则打印 ? 1 -1 ?1 。
输入由多个测试用例组成。第一行包含一个整数 t t t ( 1 ≤ t ≤ 400 1 \leq t \leq 400 1≤t≤400 ) - 测试用例的数量。测试用例说明如下。
每个测试用例由一行和两个整数 n n n 和 k k k ( 4 ≤ n ≤ 2 16 4 \leq n \leq 2^{16} 4≤n≤216 、 n n n 是 2 2 2 、 0 ≤ k ≤ n ? 1 0 \leq k \leq n-1 0≤k≤n?1 的幂次)组成。
所有测试用例的 n n n 之和不超过 2 16 2^{16} 216 。每个输入项中的所有测试用例都是成对不同的。
对于每个测试用例,如果没有解决方案,则打印一行,其中包含整数 ? 1 -1 ?1 。
否则,打印 n 2 \frac{n}{2} 2n? 行,其中 i i i 行必须包含 a i a_i ai? 和 b i b_i bi? ,即 i i i 对中的元素。
如果有多个解,则打印任意一个。按任意顺序打印解对和解对中的元素。
在第一次测试中, ( 0 & 3 ) + ( 1 & 2 ) = 0 (0\&3)+(1\&2) = 0 (0&3)+(1&2)=0 。
在第二次测试中, ( 0 & 2 ) + ( 1 & 3 ) = 1 (0\&2)+(1\&3) = 1 (0&2)+(1&3)=1 。
第三次测试, ( 0 & 1 ) + ( 2 & 3 ) = 2 (0\&1)+(2\&3) = 2 (0&1)+(2&3)=2 。
在第四次测试中,无解。
以上来自 C o d e F o r c e s ,翻译: D e e p L 以上来自CodeForces,翻译:DeepL 以上来自CodeForces,翻译:DeepL
解这题需要的重要性质:
其中 n = 2 x ( x ∈ Z ) n=2^x(x\in Z) n=2x(x∈Z)。
依据以上性质进行讨论:
最后,将这四种情况分别用代码实现,就是AC代码了。
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, k;
inline void solve();
inline void work() {
int T;
cin >> T;
while (T--) {
solve();
}
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
work();
return 0;
}
inline void solve() {
cin >> n >> k;
if (n == 4 && k == 3) {
cout << -1 << endl;
return;
}
if (k == n - 1) {
cout << n - 1 << " " << n - 2 << endl << 1 << " " << n - 3 << endl << 0 << " " << ((n - 3) ^ (n - 1)) << endl;
for (int i = 3; i < n / 2; i++) {
cout << i << " " << ((n - 1)^i) << endl;
}
} else {
cout << n - 1 << " " << k << endl;
if (k != 0) {
cout << 0 << " " << ((n - 1)^k) << endl;
}
for (int i = 1; i < n / 2; i++) {
if (i == k || i == ((n - 1)^k)) {
continue;
}
cout << i << " " << ((n - 1)^i) << endl;
}
}
}//创作不易,你敢抄袭?!