Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
 Аватар для netrox
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 64

Найти пары элементов массива сумма которых является степенью двойки

30.07.2016, 11:02. Показов 8647. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вам задано n чисел a1, a2, ..., an. Найдите количество пар индексов i, j (i < j) таких, что ai + aj является степенью двойки (то есть найдется такое целое число x, что ai + aj = 2x).
Входные данные
В первой строке следует целое положительное число n (1 ≤ n ≤ 105) — количество чисел.

Во второй строке следует n целых положительных чисел a1, a2, ..., an (1 ≤ ai ≤ 109).

Выходные данные
Выведите количество пар индексов i, j (i < j) таких, что ai + aj является степенью числа 2
Миниатюры
Найти пары элементов массива сумма  которых является степенью двойки   Найти пары элементов массива сумма  которых является степенью двойки  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.07.2016, 11:02
Ответы с готовыми решениями:

Является ли число степенью двойки? Вводится число. Напечатать YES, если оно является степенью двойки, NO - ина
Является ли число степенью двойки? Вводится число. Напечатать YES, если оно является степенью двойки, NO - иначе си шарп

Доказать, что сумма биномиальных коэффициентов является степенью двойки (через мат.индукцию)
1) Доказать, что сумма биномиальных коэффициентов равна числу 2, возведенному в степень, равную показателю степени бинома Ньютона. 2)...

Выделить цветом те столбцы числовой матрицы, максимальный элемент которых является степенью двойки
Здравствуйте. Нужна ваша помощь. Вот с таким условием задачи&quot;Выделить цветом те столбцы числовой матрицы, максимальный элемент которых...

14
 Аватар для netrox
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 64
30.07.2016, 11:04  [ТС]
Мой код оказался медленным:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include"iostream"
using namespace std;
 
int main()
{
 
    int n, mas[100000];
    int pair = 0;
    cin >> n;
    for (int i = 0; i<n; i++)
    {
        cin >> mas[i];
    }
 
    for (int k = 0; k< n - 1; k++)
    {
        for (int j = k + 1; j<n; j++)
        {
            for (int v = 2; v<1000000000; v = v * 2)
            {
                if ((mas[k] + mas[j]) == v)
                {
                    ++pair;
                                         break;
                     
                }
            }
        }
    }
    cout << pair;
}
0
 Аватар для netrox
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 64
30.07.2016, 11:11  [ТС]
В вопросе не приписал степени
Миниатюры
Найти пары элементов массива сумма  которых является степенью двойки  
Изображения
 
0
1617 / 1182 / 553
Регистрация: 08.01.2012
Сообщений: 4,561
30.07.2016, 11:28
mas[k] + mas[j] можно посчитать один раз,
и массив 20-230 можно подготоаить заранее, возможно поможет
0
Модератор
Эксперт С++
 Аватар для zss
13780 / 10973 / 6491
Регистрация: 18.12.2011
Сообщений: 29,259
30.07.2016, 13:29
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
using namespace std;
 
bool is_power2(int k)
{
    int count1=0;
    while(k)
    {
        count1+=(k&1);
        k>>=1;
    }
    return !(count1-1); // должна быть всего одна единичка
}
int main()
{
 
    int n;
    cin >> n;
    int* mas=new int[n];
    for (int i = 0; i<n; i++)
    {
        cin >> mas[i];
    }
 
    int pair = 0;
    for (int k = 0; k< n - 1; k++)
    {
        for (int j = k + 1; j<n; j++)
        {
            if( is_power2(mas[k] + mas[j]) )
                ++pair;
        }
    }
    delete[] mas;
    cout << pair<<endl;
    system("pause");
    return 0;
}
1
 Аватар для mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 972
31.07.2016, 16:39
C++
1
x & (x-1) == 0
простая проверка на степень 2-ки
3
 Аватар для netrox
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 64
31.07.2016, 20:17  [ТС]
mat_for_c, MansMI, Спасибо за помощь , конечно оба варианта рабочие, но на codeforces всё равно выдаёт, что превышено ограничение времени
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
31.07.2016, 21:24
Цитата Сообщение от netrox Посмотреть сообщение
mat_for_c, MansMI, Спасибо за помощь , конечно оба варианта рабочие, но на codeforces всё равно выдаёт, что превышено ограничение времени
А кто тогда навесил "лучший ответ" на сообщение №5, оно же не проходит по времени?
0
1617 / 1182 / 553
Регистрация: 08.01.2012
Сообщений: 4,561
31.07.2016, 21:36
5Г вариантов, даже простой перебор индексов без вычислений не укладывается
0
 Аватар для netrox
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 64
31.07.2016, 21:39  [ТС]
Mr.X, Ну ведь не я
Миниатюры
Найти пары элементов массива сумма  которых является степенью двойки  
0
 Аватар для netrox
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 64
31.07.2016, 21:41  [ТС]
Mr.X,
Миниатюры
Найти пары элементов массива сумма  которых является степенью двойки  
0
 Аватар для netrox
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 64
31.07.2016, 21:44  [ТС]
MansMI,
0
1617 / 1182 / 553
Регистрация: 08.01.2012
Сообщений: 4,561
31.07.2016, 21:55
чего?
0
 Аватар для netrox
0 / 0 / 0
Регистрация: 14.12.2015
Сообщений: 64
31.07.2016, 22:16  [ТС]
MansMI, прости , сайт заглючил
0
 Аватар для Новичок
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,361
31.07.2016, 23:19
Лучший ответ Сообщение было отмечено HighPredator как решение

Решение

N <= 105
Очевидно же, что в лоб никак не зайдет. Нужно использовать map, насчитать количество каждого числа, а затем пройтись по нему и вычислить ответ используя комбинаторные формулы. Степени двойки предварительно насчитать. Идем по map и скажем видим число 1, тогда надо найти число 2 - 1 = 1, 4 - 1 = 3, 8 - 1 = 7... И дальше перемножить количества этих чисел и чтоб не было повторений поделить на 2. Если само число является степенью двойки то надо еще в ответ добавить количество комбинаций между равными числами. Ну например есть 3 двойки, 2 + 2 = 4 степень двойки, значит надо добавить в ответ 3 * (3 - 1) / 2. Вот такой код заходит.
Код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//GNU C++11
#include <bits/stdc++.h>
 
using namespace std;
using int64 = long long;
using uint64 = unsigned long long;
 
int main() {
    ios_base::sync_with_stdio(false); 
    cin.tie(nullptr); // Эти 2 строки для ускорения ввода, порой в олимпиадных задачах без них решение может упасть по времени
    uint64 n;
    cin >> n;
    map <int64, uint64> cnt;
    for (uint64 i = 0; i < n; i++) {
        int64 t;
        cin >> t;
        cnt[t]++;
    }
    vector <int64> pow2;
    for (int64 p = 1, h = 1e18; p <= h; p *= 2) pow2.push_back(p); // Степени двойки
    uint64 ans = 0;
    for (auto& i: cnt) {
        for (auto& j: pow2) {
            if (j == 2 * i.first) {
                ans += i.second * (i.second - 1);
                continue;
            }
            auto it = cnt.find(j - i.first);
            if (it != cnt.end())
                ans += it -> second * i.second;
        }
    }
    cout << ans / 2;
}
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.07.2016, 23:19
Помогаю со студенческими работами здесь

На отрезке [а,в] найти все пары соседних чисел, сумма которых является составным числом
На отрезке найти все пары соседних чисел, сумма которых является составным числом

Найти такие пары натуральных чисел, сумма которых является квадратом некоторого натурального числа
На интервале найти такие пары натуральных чисел, сумма которых является квадратом некоторого натурального числа. Пожалуйста, экзамен.

Найти среднее арифметическое чисел, сумма цифр которых является степенью тройки. Если таких чисел нет, то вывести -1
Найти среднее арифметическое чисел, сумма цифр которых является степенью тройки. Если таких чисел нет, то вывести -1. Входные данные. ...

Количество элементов массива, являющихся k-й степенью двойки (k = 1, 2, 3, 4, 5);
Все доброго времени суток. Друзья прошу помощи. Есть задание на одномерный массив. В одномерном массиве, состоящем из n целых...

Найти из массива пары чисел, сумма которых укладывается в определенном диапазоне
доброго времени суток. задача состоит в том, чтобы подсчитать количество чисел в интервале таких, что в массиве существует хотя бы одна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru