e-olymp 4142. Большой XOR

Задача

Для заданного целого $x$ найти количество таких $a$, удовлетворяющих условию:

  • $ a $ xor $x > x $
  • $ 0 < a < x $

где $a$ и $x$ — целые, xor — битовый XOR оператор.

Имеются $q$ запросов, каждый из которых содержит целое число $x$. Для каждого запроса выведите общее количество значений $a$, удовлетворяющих условиям выше.

Входные данные

Первая строка содержит число запросов $q$ $(1 \leqslant q \leqslant 10^5)$. Каждая из следующих $q$ строк содержит значение $x$ $(1 \leqslant x \leqslant 10^{10})$.

Выходные данные

Для каждого теста выведите в отдельной строке количество значений $a$, удовлетворяющих приведенным условиям.

Тесты

Входные данные Выходные данные
1 2
2
10
1
5
2 3
13
3
16
2
0
15
3 5
1
7
4294967295
42
451
0
0
0
21
60

Код

Решение

XOR выдаёт число, биты которого равны $1$, когда лишь у одного из чисел соответствующий бит равен $1$. Числа большие чем $x$ получаем лишь тогда, когда $2^{k}\leqslant a<2^{k+1}$, где $k$- номер бита числа $x$, который равен нулю. Таких $a$ существует $2^k$ штук для каждого такого бита.

  • Задача на e-olymp
  • Код программы на ideone
  • Засчитанное решение
  • Related Images:

    e-olymp 8891. Ровно одно условие из двух

    Задача

    Для заданного целого числа $n$ вывести YES, если выполняется ровно одно из следующих условий и NO в противном случае.

    • число $n$ четное.
    • число $n$ отрицательное и кратное трем.

    Входные данные

    Одно целое число $n$.

    Выходные данные

    Вывести YES или NO в зависимости от выполнения условий.

    Тесты

     ВВОД ВЫВОД
     22  YES
     7  NO
     -30  NO
     -9  YES
     0  YES

    Код (как делать можно, но не нужно)

    Код (как делать можно и нужно)

    Решение

    Если оба условия выполняются или оба не выполняются, то нужно вывести «NO», а иначе  — «YES».

    • В первом случае проверяем четность числа $n$.
    • Во втором случае проверяем кратность трем и является ли $n$ отрицательным.
    • В обеих случаях исключаем варианты, когда оба условия могли бы выполнятся, то есть исключаем отрицательные числа и кратность трем для первого, и четность числа для второго случая.

    Ссылки
    e-olymp
    ideone

    Related Images:

    e-olymp 8374. Нечетное количество раз

    Задача 

    Найдите число, которое встречается в последовательности нечетное количество раз.

    Входные данные

    Первая строка содержит натуральное число $n (n < 500000)$. Далее следуют $n$ натуральных чисел, каждое из которых меньше $10^6$.

    Выходные данные

    Во входной последовательности только одно число $x$ повторяется нечетное количество раз. Другие числа повторяются четное число раз. Выведите $x$.

    Замечание

    В условии задачи на e-olymp опечатка, но, проанализировав входные и выходные данные примеров, несложно понять суть задачи. 

    Тесты

    Ввод Вывод
    1 9
    3 1 2 2 17 1 3 17 3
    3
    2 5
    12 13 14 13 12
    14
    3 3
    20 0 20
    0
    4 15
    5 7 1 2 3 5 7 2 7 5 1 2 3 5 2
    7
    5 11
    10 100 1000 100 100 100 1000 10 100 1000 100
    1000

    Код 1

    Код 2

    Код 3 (без массива)

     

    Решение

    Для начала создадим динамический одномерный массив и считаем с потока ввода все его элементы. Конечно, можно было создать статический массив на 500000 элементов, но, скорее всего, памяти выделилось бы намного больше, чем было бы использовано.

    Первый способ

    Отсортируем наш массив по возрастанию. Как будем сортировать особо значения не имеет, главное, чтоб одинаковые элементы стояли подряд. 

    Затем, заведём две переменные: счётчик и число. Последней присваиваем значение первого элемента массива. Сравниваем следующий элемент с тем, что лежит в переменной. Если они равны, увеличиваем счетчик. В счетчик с самого начала положим единицу, так как предполагаем, что в массиве есть хоть один элемент.

    Как только проверяемый нами элемент массива не будет равен значению переменной, проверяем счетчик на четность. Если нечетный, выводим значение переменной и завершаем работу программы. Если четный, присваиваем переменной новое значение, а счетчику снова единицу. Так будем подсчитывать пока не найдём число, повторяющееся нечетное количество раз. Если не найдем, это значит,  что искомое число последнее, так как оно обязательно есть по условию, а наша программа сработает для всех элементов, кроме последнего (последний элемент мы не можем сравнить со следующим, а значит не можем проверить счетчик).

    Второй способ

    Применим исключающее «или» ко всем элементам массива. Предварительно создадим переменную равную нулю, в которой будем это проделывать. 

    Так как xor двух одинаковых чисел равен нулю, то для любого количества пар одинаковых чисел он будет  равен нулю. А вот xor нуля и любого числа равен самому числу.

    Таким образом, исключив все пары одинаковых чисел, наша переменная примет значение повторяющегося нечетное количество раз числа. 

    Третий способ 

    Идейно такой же как предыдущий. Отличается только тем, что мы не записываем числа в массив, а исключающее «или» работает сразу после того как число было прочитано.

    Ссылки

    Задача 8374 на e-olymp

    Код 1 на Ideone

    Код 2 на Ideone

    Related Images: