помогите ускорить выполнение кода

имеется задача с олимпиады:

Условие: Задача денег. Ярослав и Мирослава имеют общую коллекцию из ? монет. Как символ своей дружбы они хотят отдельно хранить такую ​​пару монет, что в сумме нарицательная стоимость этих двух монет дает особое число ?. Подсчитайте количество разных способов выбрать нужную пару.

Технические условия: Программа Money читает с устройства стандартного ввода натуральные числа ? и ? не менее 2. Во второй строке ? натуральных чисел — номинальные стоимости монет из коллекции. Все числа (включая числа ? и ?) не превышают 200000. Программа выводит на устройство стандартного вывода единственное число — количество способов выбрать две монеты с суммарной номинальной стоимостью ?. Известно, что искомое количество не превышает 10^9.

написал код, но не проходит даже 25% тестов, ибо слишком медленно. вот мой код:

s, n = map(int, input().split())
m = list(map(int, input().split()))
m.sort()
count = 0

for i in reversed(m):
    if i >= s:
        m = m[:len(m)-1:]
    else:
        break

while True:
    zapper_start = m[0]
    first_counter = 0

    zap_m = m
    last_obr = 0

    if m[0] != m[-1]:
        for i in reversed(m):
            if i + zapper_start != s:
                zap_m = zap_m[:len(m)-1:]
                last_obr += 1
            else:
                zapper_last = zap_m[-1]
                m = m[:len(m)-last_obr:]
                last_counter = 0

                for j in reversed(m):
                    if j == zapper_last:
                        m = m[:len(m)-1:]
                        last_counter += 1
                    else:
                        break

                for j in m:
                    if j == zapper_start:
                        m = m[1::]
                        first_counter += 1
                    else:
                        break

                count += (last_counter * first_counter)

                break
    else:
        counter = 0
        twos_count = 0

        for num in m:
            twos_count += 1
            counter += twos_count - 1

        count += counter
        break

    if not m:
        break

print(count)

помогите максимально ускорить его выполнение, либо как-то изменить решение.

UPD: тут можно проверить количество баллов: https://new.netoi.org.ua/index_ua.php?lng=ua&cid=2113

решение на 11 баллов из 100:

s, n = map(int, input().split())
nominal = list(map(int, input().split()))[:n:]

counter = 0
while True:
    delItem = nominal.pop(len(nominal)-1)
    for i in nominal:
        suma = delItem + i
        if suma == s:
            counter += 1
    if len(nominal) == 0:
        print(counter)
        break

Ответы (1 шт):

Автор решения: Alex Bond

Я если честно не сразу понял ТЗ. Вот если кому то нужно.

1
Сумма монет: 4. Кол-во монет: 5.
Номиналы: 2 2 3 2 1
Варианты: 4
2
Сумма монет: 10. Кол-во монет: 3.
Номиналы: 6 2 10
Варианты: 0

В первом примере дети могут выбрать пару одним из четырех способов: взять первую и вторую монеты; или первую и четвертую; или вторую и четвертую; или третью и пятую. Во втором примере никакие две монеты, к сожалению, не дают на сумму стоимость 10.

UPD. Написал код. Вообщем. s - сумма 2х монет, n - количество монет, не вводил а сразу в массив записал для простоты по примеру.

s = input("Введите сумму: ")
s = int(s)
#nominal = input("Введите количество монет: ")
#nominal = int(n)
nominal = [2, 2, 3, 2, 1]
counter = 0
while True:
    delItem = nominal.pop(len(nominal)-1)
    for i in nominal:
        sum = delItem+i
        if sum == s:
            counter+=1
    if len(nominal) == 0:
        print(f"Количество вариантов : {counter}")
        break
→ Ссылка