Задания
Версия для печати и копирования в MS Word
Тип 27 № 56527
i

Дана по­сле­до­ва­тель­ность на­ту­раль­ных чисел. Рас­сто­я­ние между эле­мен­та­ми по­сле­до­ва­тель­но­сти  — это раз­ность их по­ряд­ко­вых но­ме­ров. На­при­мер, если два эле­мен­та стоят в по­сле­до­ва­тель­но­сти рядом, рас­сто­я­ние между ними равно 1, если два эле­мен­та стоят через один  — рас­сто­я­ние равно 2 и так далее.

Назовём парой любые два числа из по­сле­до­ва­тель­но­сти, рас­сто­я­ние между ко­то­ры­ми не мень­ше 18. Не­об­хо­ди­мо опре­де­лить ко­ли­че­ство пар, в ко­то­рых сумма чисел в паре де­лит­ся без остат­ка на 8, а их про­из­ве­де­ние  — на 2187.

Вход­ные дан­ные.

Файл А

Файл В

Пер­вая стро­ка вход­но­го файла со­дер­жит целое число N  — общее ко­ли­че­ство чисел в на­бо­ре. Каж­дая из сле­ду­ю­щих N строк со­дер­жит одно число, не пре­вы­ша­ю­щее 100 000. Га­ран­ти­ру­ет­ся, что число в от­ве­те не пре­вы­ша­ет 2 · 109.

Вам даны два вход­ных файла (A и B), каж­дый из ко­то­рых имеет опи­сан­ную выше струк­ту­ру. В от­ве­те ука­жи­те два числа: сна­ча­ла ис­ко­мое зна­че­ние для файла A, затем  — для файла B.

 

Ответ:

Спрятать решение

Ре­ше­ние.

При­ведём ре­ше­ние пунк­та А на языке 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, если со­во­куп­ное ко­ли­че­ство троек (при раз­ло­же­нии на про­стые мно­жи­те­ли) в этих чис­лах боль­ше семи. А сумма чисел де­лит­ся на 8, если сумма остат­ков от де­ле­ния этих чисел на 8 сама де­лит­ся на 8. По­это­му, для ре­ше­ния за­да­чи рас­пре­де­лим дан­ные числа в дву­мер­ный мас­сив, пер­вый ин­декс ко­то­ро­го яв­ля­ет­ся остат­ком от де­ле­ния на 8, а вто­рой  — ко­ли­че­ство троек. В ячей­ках этого мас­си­ва будут мас­си­вы ин­дек­сов таких чисел. Пе­ре­берём все воз­мож­ные ком­би­на­ции остат­ков от 8 и ко­ли­че­ства троек, а в под­хо­дя­щих ком­би­на­ци­ях пе­ре­берём пары ин­дек­сов. За­ме­тим, что каж­дая под­хо­дя­щая пара будет по­счи­та­на ровно по два раза, по­это­му ре­зуль­тат подсчёта делим на 2.

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)


Аналоги к заданию № 56527: 56555 Все