Дана последовательность натуральных чисел. Расстояние между элементами последовательности — это разность их порядковых номеров. Например, если два элемента стоят в последовательности рядом, расстояние между ними
Назовём парой любые два числа из последовательности, расстояние между которыми
Входные данные.
Первая строка входного файла содержит целое
Вам даны два входных файла
Ответ:
Приведём решение пункта А на языке Python.
N = 1086
count = 0
f = open('27-A.txt')
s = f.readlines()
for i in range(1, len(s)):
for j in range(i, len(s)):
if j - i + 1 >= 18:
if (int(s[i]) + int(s[j])) % 8 == 0 and (int(s[i]) * int(s[j])) % 2187 == 0:
count += 1
print(count)
Ответ: 350 507749149.
Примечание.
Путь к файлу необходимо указать согласно расположению файла на Вашем компьютере.
Приведём другое решение на языке Python.
Заметим, что 2187 = 3**7. Произведение двух чисел делится на 3**7, если совокупное количество троек (при разложении на простые множители) в этих числах больше семи. А сумма чисел делится
o=open("27.txt")
N = int(o.readline())
raw_arr = [int(i) for i in o]
arr = [ [ [] for j in range(11) ] for i in range(8) ]
def count3(n):
count = 0
while n % 3 == 0:
count += 1
n //= 3
return count
for i in range(N):
arr[raw_arr[i]%8][count3(raw_arr[i])].append(i)
count = 0
for i8 in range(8):
for j8 in range(8):
for i3 in range(11):
for j3 in range(11):
if (i8 + j8) % 8 == 0 and (i3 + j3) >= 7:
for a in arr[i8][i3]:
for b in arr[j8][j3]:
if abs(a - b) >= 18:
count += 1
print(count // 2)
Приведём решение Сергея Фефелова на языке Python.
f = list(map(int, open('27-B.txt').readlines()))
li = [[0]*9 for i in range(8)]
def count3(n):
count = 0
while n % 3 == 0 and count < 8:
count += 1; n //= 3
return count
count = 0
for i, p in enumerate(f[18:]):
j3 = count3(p)
for l3 in range(max(0,7-j3),9):
count += li[(-p)%8][l3]
li[f[i+1]%8][count3(f[i+1])] += 1
print(count)
Приведём решение Юрия Красильникова на языке Python.
def pwr(n,base):
return 0 if n%base else 1 + pwr(n//base,base)
f = open('27-B.txt')
f.readline()
p = [[0]*15 for _ in range(8)] # 3**14 > 100000
k = 0
q = [] # очередь из 18 элементов
for s in f:
x = int(s)
rx = x%8
px = pwr(x,3)
rd = (8 - rx)%8
pd = max(7 - px, 0)
k += sum(p[rd][pd:])
q.append((rx,px))
if len(q) >= 18:
m,n = q.pop(0)
p[m][n] += 1
print(k)

