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;
}
posted @ 2022-01-29 18:32  彬腾  阅读(65)  评论(0)    收藏  举报