совместимые числа
Условие
Дан массив длины . .
Два целых числа x и y называются совместимыми, если результат их побитового «И» равен нулю.
Выведите целых чисел . — любое такое число, что a_i & ans_i = 0, и при этом содержится в массиве , Иначе .
Решение
Решение
Что такое ? Значит для всех j
-ых бит выполняется эти условия по определению :
- , значит
- , значит или
Пусть произвольное число. ~x
инвертированное по битам x
. Перепишем условия выше:
- , значит
- , значит или
Другими словами:
- , значит любое
- , значит
Пример:
...
Посчитаем динамику по маскам .
- зафиксируем позиции . Для условия . Следовательно на позициях можно поставить .
- значение или , можно ли собрать , где новая если некоторые в поменять на .
Ответ для значения , находится в , где .
const int M = 22;
int can[(1 << M) + 1];
void solve() {
fill(begin(can), end(can), -1);
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
can[a[i]] = a[i];
}
for (int j = 0; j < M; pos++) {
for (int mask = 0; mask < (1 << M); mask++) {
if (can[mask] != -1) {
can[mask | (1 << j)] = can[mask];
}
}
}
int ones = (1 << M) - 1;
for (int i = 0; i < n; i++) {
cout << (can[ones - a[i]] != -1 ? can[ones - a[i]] : -1) << ' ';
}
}
TODO чё за z? я видимо мискуликнул