Правильный ответ: 30 360137507
Вывод программы: 30 369520943
with open("27-13b.txt") as f:
raw = f.readlines()
print(raw[0])
data = [int(x) for x in raw[1:]]
def div(a, b):
return a%b==0
count = 0
# индексы элементов делящихся только на 2 и на 7
ids_only2 = []
ids_only7 = []
for i in range(len(data)):
a = data[ i]
# Для всех чисел делящихся на 14 верно следующее утверждение:
# 14*n * k = 14*n*k ,где n, k - любые числа.
if div(a, 14):
i_next = i+7
i_prev = i-6
# считаем все числа справа и слево от числа
count += len(data[i_next:])
if i_prev > 0:
count += len(data[:i_prev])
elif div(a, 2):
ids_only2.append(i)
elif div(a, 7):
ids_only7.append(i)
# Для всех чисел кратных только 7 и 2 верно:
# 7*k * 2*n = 14*k*n ,где k, n - любые числа
for i2 in ids_only2:
i_next = i2+7
i_prev = i2-7
# считаем все числа справа и слева от числа
for i7 in ids_only7:
if i7 >= i_next or i7 <= i_prev:
count += 1
print(count)
Для начала объясню логику своих рассуждений для лучшего понимания программы(а также возможно в них и кроется ошибка).
Когда произведение кратно 14? Ответ в двух случаях ,когда
1) Одно или оба числа делятся на 14.
2) Когда одно число делится на 7 ,а другое на 2.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Допустим i+3<=j ,тогда поймём в скольких произведениях будет участвовать элемент с i=5(то есть число 5).
Говоря о паре (a_i, a_j) ,рассмотрим для представленной последовательности случаи ,когда a_j = 5:
a_i будет равен одному из чисел последовательности [0, 1, 2]
теперь рассмотрим случай a_i = 5:
a_j будет равен одному из чисел последовательности [8, 9, 10]
Из этого маленького примера я сделал вывод ,что можно рассматривать числа как бы с двух сторон
в одном случаи они являются a_i ,а в другом a_j.
[0, 1, 2] 5 [8, 9, 10]
Мне интересно ,что я упустил в своих рассуждениях никак не могу понять. Буду благодарен ,если кто-нибудь объяснит.