Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
16 / 14 / 4
Регистрация: 05.06.2019
Сообщений: 79

Олимпиадная задача

01.10.2020, 06:33. Показов 6631. Ответов 37

Студворк — интернет-сервис помощи студентам
Написал код, но он жутко медленный на больших значениях. Как исправить?

Правой частью натурального числа N назовем число K, полученное из двоичной записи числа N отбрасыванием всех цифр, стоящих левее крайней правой единицы, и преобразованное обратно в десятичную систему. Так, правой частью числа 6 является число 2, а правой частью числа 1088 – число 64.

Вам требуется определить сумму правых частей всех натуральных чисел из интервала [A, B], включая границы этого интервала, где 1 < A < B < 10^15. Гарантируется, что результат будет помещаться в 64-битное целое число. Для 50 % тестов 1 < A < B < 10^8, а результат будет помещаться в 32-битное целое число.


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
A = int(input())
B = int(input())
c = [i for i in range(A, B+1)]
main_mas = []
out_mas = []
 
 
for i in c:
    main_mas.append(str(bin(i))[:1:-1])
print(main_mas)
for elem in range(len(main_mas)):
    d = main_mas[elem].index('1')
    f = main_mas[elem][:d].replace('1', '0')
    c = main_mas[elem][d+1:].replace('1', '0')
    print(main_mas)
    print('')
    out = f + main_mas[elem][d] + c
    main_mas[elem] = out[::-1]
 
 
for i in main_mas:
   out_mas.append(int(eval('0b'+'{}'.format(i))))
 
print(sum(out_mas))
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.10.2020, 06:33
Ответы с готовыми решениями:

Олимпиадная задача
...Однажды в Арктике обострилось межвидовое противостояние. Полярные совы решили проявить глобальные амбиции и построили треугольное...

Олимпиадная задача
Занумеруем пальцы правой руки: 1 - мизинец, 2 - безымянный, 3 - средний, 4 - указательный и 5 - большой. Начнём считать пальцы на правой...

Олимпиадная задача
Каждую субботу и воскресенье в школе танцев проходят занятия, притом в один день проводится одно занятие в каком-то определённом стиле. Для...

37
Эксперт Python
5439 / 3860 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
01.10.2020, 16:31
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от user1472382 Посмотреть сообщение
Компилятор Яндекс.Контеста ругается на превышение лимита памяти (
Убери list comprehensions из решения eaa, sum понимает итераторы. Тогда суммироваться значения должны итеративно без напряга ОЗУ цельным списком с миллиардом циферок.
1
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
01.10.2020, 16:43
Garry Galler, по времени все равно не вытянет.
у меня на таких входных данных считает
Python
1
2
a = 1
b = 10**1500
time = 0:00:00.046122
0
16 / 14 / 4
Регистрация: 05.06.2019
Сообщений: 79
01.10.2020, 17:09  [ТС]
Garry Galler, памяти стало использовать в разы меньше, спасибо за подсказку. Возросло время выполнения (ограничение в 2 секунды, выполняется буквально на 6 мс больше)

Добавлено через 1 минуту
eaa, пока шел домой появилось пару мыслей насчет "формулы".
Ты же тоже над ней думал, не так ли? Напиши, к чему в итоге пришел, подумаем все вместе
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
01.10.2020, 17:10
user1472382, я уже решил давно. формула рекурсивная. если не получится я свое решение скину.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
01.10.2020, 17:34
eaa,
Тоже есть, но без рекурсии(
Но тоже быстро

Добавлено через 35 секунд
Кстати, для 1 10^15 тот же результат
0
16 / 14 / 4
Регистрация: 05.06.2019
Сообщений: 79
01.10.2020, 18:52  [ТС]
eaa, на самом деле мне было бы и правда проще разобрать чужой код и переписать его несколько раз чем изобретать велосипед (причем с квадратными колесами) по несколько часов (хотя если начинать заполнять массив с 1, то я в целом смог состряпать простенькую формулу. Но если вести отчет, например, с 5? Тут я бессилен...)

Gdez,
Так что, делитесь

Добавлено через 6 минут
Похвастаюсь, тоже придумал рекурсивную. Но совсем топорную
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
01.10.2020, 19:02
Идея такая
135
Максимальное число степени двойки - 128. Входит 1 раз
Следующая - 64. Входит 2 раза. Минус предыдущее 1. Ответ 1
Следующая - 32. Входит 4 раза. Минус сумма предыдущих (1 + 1). Ответ 2
Следующая - 16. 8 раз. Ответ - 4
Следующая - 8. 16 раз. Ответ - 8
След - 4. 33 раза. Ответ - 17
След - 2. 67 раз. Ответ - 34
След - 1. 135 раз. Ответ - 68
Теперь результат для 135 = 2^0 * 68 + 2^1 * 34 + 2^2 * 17 +....... = 588

Добавлено через 2 минуты
Находишь для A и B отдельно
Ответ -> для (B) - (A)

Добавлено через 55 секунд
user1472382, покажи код )
Рекурсия у меня как то так...
2
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
01.10.2020, 19:12
Цитата Сообщение от Gdez Посмотреть сообщение
Ответ -> для (B) - (A)
+1 еще наверное

Добавлено через 1 минуту
user1472382, давай код, а там посмотрим.
мой код на 1 строчку больше предыдущего кода))
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
01.10.2020, 19:26
eaa, Нет, на три строчки не потяну.(
Можно конечно завернуть в длинные генераторы.
По отдельности получилось 15 строчек.

Добавлено через 58 секунд
user1472382, А рабочая ссылка на тестирование (посмотреть свой код) есть?
0
16 / 14 / 4
Регистрация: 05.06.2019
Сообщений: 79
01.10.2020, 19:42  [ТС]
Gdez, простите, когда писал "топорный" не подумал, что наши алгоритмы сойдутся))))

А вообще, код простой.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import math
 
A = int(input(" "))
B = int(input())
sums = []
 
i = 1
d = math.floor(math.log2(B))
 
for i in range(d+1):
    d = B//(2**i)
    if abs(d//2 - d/2) >= 0.5:
        sums.append(math.ceil((d/2))*(2**i))
    else:
        sums.append(math.floor(d/2)*(2**i))
 
print(sum(sums))
Осталось только это добавить. Но это я уже сам додумаю. Спасибо большое.
Цитата Сообщение от user1472382 Посмотреть сообщение
Но если вести отчет, например, с 5?
.
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
01.10.2020, 19:43
Лучший ответ Сообщение было отмечено u235 как решение

Решение

Python
1
2
3
f = lambda n: 2*f(n//2) + n//2 + n%2 if n else 0
a, b = map(int, input().split())
print(f(b)-f(a)+1)
2
16 / 14 / 4
Регистрация: 05.06.2019
Сообщений: 79
01.10.2020, 19:49  [ТС]
eaa, eaa, ого, 3 строки всего...
пойду, пожалуй, Лутца дочитаю...

Добавлено через 1 минуту
Gdez, там от школы регистрировали, так что сейчас уже никак
Можешь скинуть мне свой код в лс, я отпишусь о результатах
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
01.10.2020, 19:50
user1472382, я не читал Лутца, ничего сказать не могу.
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
01.10.2020, 19:51
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import math
a, b = map(int,input().split())
 
def binN(c) :
    n = int(math.log2(c)) + 1
    res, kof = 0, 0
    for k in range(n) :
        st = 2 ** (n - k -1)
        count = c // st - kof
        kof += count
        res += st * count
    return res
 
if a < 2 :
    print(binN(b))
else :
    print(binN(b) - binN(a-1))
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
01.10.2020, 19:54
Лучший ответ Сообщение было отмечено u235 как решение

Решение

Python
1
2
3
f = lambda n: 2*f(n//2) + n//2 + n%2 if n else 0
a, b = map(int, input().split())
print(f(b)-f(a-1))
у меня там ошибка
2
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,320
01.10.2020, 19:57
Нет. Похоже рекурсию ниасилю очдолго
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
01.10.2020, 20:35
Щас кто-то олимпиаду выиграет
1
16 / 14 / 4
Регистрация: 05.06.2019
Сообщений: 79
02.10.2020, 03:52  [ТС]
eaa,
Как жаль, что это только пробники
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.10.2020, 03:52

Олимпиадная задача
Задание 1. Написать и отладить программу, выполняющую задание. Подпрограмма должна быть рекурсивной. 2. Выполнить трассировку...

Олимпиадная задача за 10 класс
Задача: Тот факт, что «дважды два четыре», принимается без каких-либо сомнений, хотя доказательство этого факта не такое простое. Кроме...

Олимпиадная задача Кирпичи
Здравствуйте, решал задачу кирпичи F. Кирпичи Ограничение времени 1 секунда Ограничение памяти 64Mb Ввод стандартный ввод или...

Олимпиадная задача на перебор
добрый день, помогите, пожалуйста, оптимизировать решение. Сама задача: пользователь вводит 2 числа n и m, где n - количество чисел. ...

Похожие подарки Олимпиадная задача
Поликарпу уже надоело получать массивы натуральных чисел на день рождения и другие праздники. Поэтому его друзья Монокарп и Бикарп решили...


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

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru