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

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

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

Файл A

Файл B

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

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

 

Ответ:

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

Ре­ше­ние.

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

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

n=int(f.readline())

numbers=[int(x) for x in f]

i=0

k=0

while i!=n:

for h in range(i+1,n):

if (numbers[i]+numbers[h])%3==0 and (numbers[i]*numbers[h])%1024==0:

k=k+1

i=i+1

print(k)

 

Ответ: 529 и 2 005 090 253.

 

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

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

 

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

f = open("27.txt")

n=int(f.readline())

a = [[0]*11 for i in range(3)]

for i in range(n):

x=int(f.readline())

j=x%3

k=0

while x%2 == 0:

k += 1

x //= 2

if k == 10: break

a[j][k] += 1

k=sum(a[0][i]*(a[0][i]-1)//2 for i in range(5,11))

k+=sum(a[0][i]*a[0][j] for i in range(11) for j in range(max(i+1,10-i),11))

k+=sum(a[1][i]*a[2][j] for i in range(11) for j in range(10-i,11))

print(k)

 

При­ведём ре­ше­ние Юрия Кра­силь­ни­ко­ва на языке Python.

def pwr(n,base):

return 0 if n%base else 1 + pwr(n//base,base)

k = 0

base,maxpwr,sp = 2,10,3 # 1024 = 2**10, sp - сумма пары

t = [[0]*(maxpwr+1) for _ in range(sp)]

a = [int(s) for s in open('27-B.txt')][1:]

for x in a:

r = x%sp

p = min(pwr(x,base),maxpwr)

k += sum(t[(sp - r)%sp][maxpwr - p:])

t[r][p] += 1

print(k)


Аналоги к заданию № 48448: 48475 51996 52198 Все