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

Дана по­сле­до­ва­тель­ность на­ту­раль­ных чисел. Назовём парой любые два числа из по­сле­до­ва­тель­но­сти. Не­об­хо­ди­мо опре­де­лить ко­ли­че­ство пар, в ко­то­рых де­ся­тич­ная за­пись про­из­ве­де­ния чисел в паре за­кан­чи­ва­ет­ся ровно на 6 нулей.

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

Файл А

Файл В

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

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

 

Ответ:

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

Ре­ше­ние.

При­ведём ре­ше­ние пунк­та А на языке Python.

f = open('27-A.txt')

s = f.readlines()

count = 0

for i in range(1, len(s)-1):

for j in range(i+1, len(s)):

if (int(s[i]) * int(s[j])) % 1000000 == 0 and i != j and (int(s[i]) * int(s[j])) % 10000000 != 0:

count += 1

print(count)

 

Ответ: 89  35773558.

 

При­ме­ча­ние.

Путь к файлу не­об­хо­ди­мо ука­зать со­глас­но рас­по­ло­же­нию файла на Вашем ком­пью­те­ре.

 

При­ведём дру­гое ре­ше­ние на языке Python.

o=open('27-B.txt')

o.readline()

# Со­зда­дим дву­мер­ный мас­сив. Пер­вый ин­декс будет

# ко­ли­че­ство двоек, вто­рой - ко­ли­че­ство пятёрок.

# В ячей­ках мас­си­ва будет хра­нить­ся ко­ли­че­ство таких чисел.

# Сна­ча­ла за­пол­ним этот мас­сив ну­ля­ми.

arr=[ [0 for j in range(13) ] for i in range(30) ]

for n in o :

n=int(n)

power_of_2 = 0

while n%2==0:

power_of_2 += 1

n=n//2

power_of_5 = 0

while n%5==0:

power_of_5 += 1

n=n//5

arr[power_of_2][power_of_5]+=1

count=0

# Об­хо­дим все воз­мож­ные ком­би­на­ции ко­ли­че­ства двоек и пятёрок

for i in range(30):

for j in range(13):

for k in range(30):

for l in range(13):

# Про­из­ве­де­ние окан­чи­ва­ет­ся на 6 нулей, если

# со­во­куп­ное ко­ли­че­ство двоек в обоих чис­лах пары

# боль­ше или равно 6, так же и пятёрок, при этом

# хотя бы одно из них в точ­но­сти равно 6

# (иначе нулей будет боль­ше шести)

if (i+k>=6 and j+l>=6) and (i+k==6 or j+l==6):

# Уве­ли­чи­ва­ем счётчик. Впо­след­ствии раз­де­лим

# его на 2, т. к. по­ря­док чисел в паре не

# имеет зна­че­ния.

count += arr[i][j] * arr[k][l]

if i==k and j==l:

# В этом слу­чае в зачёт по­па­дут пары

# из оди­на­ко­вых чисел. Нужно их ис­клю­чить.

count -= arr[i][j]

# Хоть такие ком­би­на­ции i, j, k и l мы

# обойдём по од­но­му разу, де­ле­ние на 2

# всё равно по­тре­бу­ет­ся. (См. фор­му­лу

# ко­ли­че­ства со­че­та­ний из n по k.)

print(count // 2)

 

При­ведём ре­ше­ние Ро­ма­на На­тро­би­на на языке Python.

f = open('27-B.txt')

mat = [[0 for i in range(8)] for j in range(8)]

ans = 0

f.readline()

for i in f:

m, n = 0, 0

x = int(i)

for p in range(7, -1, -1):

if x % (2**p) == 0:

m = p

break

for p in range(7, -1, -1):

if x % (5**p) == 0:

n = p

break

mat[m][n] += 1

for i in range(3):

ans += mat[i][7] * mat[6 - i][7]

ans += mat[7][i] * mat[7][6 - i]

ans += mat[7][3] * (mat[7][3] - 1) // 2

ans += mat[3][7] * (mat[3][7] - 1) // 2

for i in range(7):

for j in range(7):

for k in range(6 - j, 8):

if i != 6 - i or j != k:

ans += (mat[i][j] * mat[6 - i][k])

else:

ans += (mat[i][j] - 1) * mat[i][j] // 2

for k in range(7 - i, 8):

if i != k or j != 6 - j:

ans += (mat[i][j] * mat[k][6 - j])

else:

ans += (mat[i][j] - 1) * mat[i][j] // 2

mat[i][j] = 0

print(ans)


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