Задача к ЕГЭ по информатике на тему «Макс/мин, кол-во пар, смешаное кратно/не кратно» №2

На вход подаётся последовательность из 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
Оцените статью
Я решу все!