Тема 27. Программирование – оптимизация по времени и по памяти

27.07 Прочие прототипы

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

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

Задача 1#43245

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

Пример входных данных:

Первая строка входного файла содержит число N  – общее количество чисел в наборе. Каждая из следующих   N  строк содержит натуральные числа, не превышающих 10000  .

Пример входного файла:

5

2

4

8

1

3

Для указанных данных ответом будет являться 4  .

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

Решение 1

f = open(’27.txt’)
n = int(f.readline())
k = 8
ans = [0]*k
for i in range(n):
    x = int(f.readline())
    ans_new = ans[:] #Аналог ans.copy()

    #Подсчет ответа для уже существующих подмножеств
    for j in range(k):
        ans_new[(j*x) % k] += ans[j]
    #Составление нового множества из одного числа x
    ans_new[x % k] += 1

    #Сохранение нового количества множеств
    ans = ans_new[:]

print(ans[4])

Решение 2

def dels(k):
    a = []
    for i in range(1, int(k**0.5)+1):
        if k % i == 0:
            a.append(i)
            if i != k // i:
                a.append(k // i)

    return sorted(a)[::-1]

def sol(k, data):
    ans = [0] * (k + 1)
    dels_of_k = dels(k)

    for i in range(n):
        x = data[i]
        ans_new = ans[:]  # Аналог ans.copy()

        # Подсчет ответа для уже существующих подмножеств
        for j in dels_of_k:
            for q in dels_of_k:
                if j * x % q == 0:
                    ans_new[q] += ans[j]
                    break

        # Составление нового множества из одного числа x
        for j in dels_of_k:
            if x % j == 0:
                ans_new[j] += 1
                break

        # Сохранение нового количества множеств
        ans = ans_new[:]

    return ans[k]

f = open(’1.txt’)
n = int(f.readline())
                                                                                                     
                                                                                                     
data = [int(f.readline()) for i in range(n)]

print(sol(4, data) - sol(8, data))

Решение 3

def dels(k):
    a = []
    for i in range(1, int(k**0.5)+1):
        if k % i == 0:
            a.append(i)
            if i != k // i:
                a.append(k // i)

    return sorted(a)[::-1]

def sol(k, data):
    ans = [0] * (k + 1)
    dels_of_k = dels(k)

    for i in range(n):
        x = data[i]
        ans_new = ans[:]  # Аналог ans.copy()

        # Подсчет ответа для уже существующих подмножеств
        for j in dels_of_k:
            for q in dels_of_k:
                if j * x % q == 0:
                    ans_new[q] += ans[j]
                    break

        # Составление нового множества из одного числа x
        for j in dels_of_k:
            if x % j == 0:
                ans_new[j] += 1
                break

        # Сохранение нового количества множеств
        ans = ans_new[:]

    return ans[4]

f = open(’27A.txt’)
n = int(f.readline())
                                                                                                     
                                                                                                     
data = [int(f.readline()) for i in range(n)]

print(sol(8, data))

Ответ: 34816 2765210171205484544

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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