Codeforces Round #768 (Div. 2) C. And Matching
C. And Matching
题目描述
给一对数,n和k,让你找 用0 - n-1 的数字组成n/2对,每对& 后相加要等于 k
如果能找到输出n/2对数据,否则输出-1

思路
- k=0,只需要构造出(i,n-i-1);
- 0<k<n-1,只需要构造出 0 + k 即可 , 0&n-1=0 , k&n-1-k = 0 ,我们只需要交换位置如,k&n-1 = k
- k = n - 1, (n−1)&(n−2)=n−2, 例如 1111&1110=1110 , n-3 & 1 = 1 ,例如,1111&0001 = 0001 , 0 & 2 = 0,其余的全为0即可
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int a[N], b[N];
void solve() {
int n, k; cin >> n >> k;
int t = (n - 1) / 2;
if (n == 4 && k == 3) {
puts("-1");
}
else if (k == 0) {
for (int i = 0; i <= (n - 1) / 2; ++i) {
printf("%d %d\n", i, n - i - 1);
}
}
else if (k < n - 1) {
printf("0 %d\n", n - 1 - k);
printf("%d %d\n", k, n - 1);
for (int i = 0; i <= (n - 1) / 2; ++i) {
if (i != 0 && i != k && i != n - 1 - k) {
printf("%d %d\n", i, n - 1 - i);
}
}
}
else {
printf("%d %d\n", n - 1, n - 2);
printf("2 0\n");
printf("1 %d\n", n - 3);
for (int i = 0; i <= (n - 1) / 2; ++i) {
if (i != 0 && i != 1 && i != 2 && i != k && i != n - 1 - k) {
printf("%d %d\n", i , n - i - 1);
}
}
}
}
int main ()
{
ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
int _; cin >> _;
while (_ --) solve();
return 0;
}

浙公网安备 33010602011771号