Тема 27. Программирование

27.07 Макс/мин, кол-во пар, смешаное кратно/не кратно

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела программирование
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#29431

На вход подаётся последовательность из 7 < n < 100000+ 1  натуральных чисел, каждое из которых не больше 1000  . Напишите программу, вычисляющую количество пар элементов последовательности, сумма которых делится на 5  или       7  , произведение кратно 6  и хотя бы одно число из пары больше 40  , находящихся на расстоянии не меньше 5  .

Формат входных данных

В первой строке дано количество чисел n  , в каждой из последующих n  строк записано одно натуральное число, не превышающее 1000  .

Формат выходных данных

В ответе запишите два числа через пробел: сначала искомое количество для файла A, затем для файла B.

Пример:

10

56

84

26

81

28

93

60

29

72

36

Ответом для примера будет: 2

Вложения к задаче
Показать ответ и решение

Решение 1 (неэффективное)

f = open("27A.txt")
n = int(f.readline())
a = [int(f.readline()) for x in range(n)]
ans = 0
for i in range(n):
    for j in range(i + 5, n):
        if ((a[i] + a[j]) % 5 == 0) or ((a[i] + a[j]) % 7 == 0):
            if (a[i] * a[j]) % 6 == 0:
                if (a[i] > 40) or (a[j] > 40):
                    ans += 1
print(ans)

Решение 2 (эффективное)

f = open(’3_B.txt’)

s = 5  # Расстояние между элементами
p = 6  # Чему должно быть кратно произведение
d = [6, 3, 2, 1]  # Делители числа p

n = int(f.readline())
x = [int(i) for i in f]

# Списки с количествами чисел, удовлетворяющих определенным условием
# Индексы числа nums_{k}[x][y][z] обозначают следующее:
# x - больше ли число чем 40 (0 - нет, 1 - да)
# y - делитель из списка d, которому кратно число
# z - остаток от деления числа на k
nums_5 = [[[0] * 5 for _ in range((p + 1))] for _ in range(2)]
nums_7 = [[[0] * 7 for _ in range((p + 1))] for _ in range(2)]
nums_35 = [[[0] * 35 for _ in range((p + 1))] for _ in range(2)]
cnt = 0

for i in range(s, n):
    # Элемент, находящийся на расстоянии s от текущего
    t = x[i - s]
    # Заполняем списки, увеличивая количества чисел по условиям
    for j in d:
        if t % j == 0:
            nums_5[int(t > 40)][j][t % 5] += 1
            nums_7[int(t > 40)][j][t % 7] += 1
            nums_35[int(t > 40)][j][t % 35] += 1

    # Вычисляем остатки от деления на {k}, которыми должны обладать пары для текущего числа
    ost_5 = (5 - (x[i] % 5)) % 5
    ost_7 = (7 - (x[i] % 7)) % 7
    ost_35 = (35 - (x[i] % 35)) % 35

    # Если текущее число больше 40, его можно ставить в пару с числами и больше и меньше 40
    if x[i] > 40:
        # Ищем наибольший делитель, на который делится текущее число
        for j in d:
            if x[i] % j == 0:
                # Вычисляем необходимый парный делитель для числа-пары
                dl = p // j
                # Количество чисел, которые делится на 5 или на 7, равносильно
                                                                                                     
                                                                                                     
                # сумме количества чисел, делящихся на 5, и количества чисел, делящихся на 7,
                # из которых вычли количество чисел, делящихся на 35
                for r in range(2):
                    cnt += nums_5[r][dl][ost_5] + nums_7[r][dl][ost_7] - nums_35[r][dl][ost_35]
                break
    # Если текущее число не больше 40, его можно ставить только в пары к числам больше 40
    else:
        for j in d:
            dl = p // j
            if x[i] % j == 0:
                cnt += nums_5[1][dl][ost_5] + nums_7[1][dl][ost_7] - nums_35[1][dl][ost_35]
                break

print(cnt)

Ответ: 9 6560792

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!