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

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

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

Файл А

Файл В

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

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

 

Ответ:

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

Ре­ше­ние.

При­ве­дем ре­ше­ние на языке Python для файла A.

f = [int(i) for i in open('27-A.txt')]

k = 0

for x in range(1, len(f)):

for y in range(x+1, len(f)):

if not (f[x] + f[y]) % 4 and not (f[x] * f[y]) % 6561:

k += 1

print(k)

 

При­ве­дем ре­ше­ние на языке Python для файла В.

f = [int(i) for i in open('27-B.txt')]

li, F = [[0]*9 for _ in range(4)], f[1:]

k = 0

fn = lambda k, n: fn(k+1, n) if not n % (3 ** k) else k - 1

for i in range(f[0]):

four = F[i] % 4

may = fn(1, F[i])

if may > 8:

may = 8

for j in range(8 - may, 9):

k += li[(4 - four) % 4][j]

li[four][may] += 1

print(k)

 

Ответ: 306 360950279.

 

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

def pwr(n,base):

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

k = 0

base,maxpwr,sp = 3,8,4 # 6561 = 3**8, sp - сумма пары

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

a = [int(s) for s in open('272.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 Все