27.07 Макс/мин, кол-во пар, смешаное кратно/не кратно
Ошибка.
Попробуйте повторить позже
Имеется набор данных из целых положительных чисел. Рассматриваются все пары различных элементов последовательности. Необходимо определить количество пар, сумма которых будет кратна , а произведение кратно .
В первой строке входных данных задаётся количество чисел . В каждой из последующих строк записано одно целое положительное число, не превышающее .
В ответе укажите два числа через пробел: сначала значение искомой суммы для файла , затем для файла .
Входные данные | Выходные данные |
5 | 2 |
5 | |
20 | |
20 | |
19 | |
15 | |
Переборное решение:
f = open(’1_A.txt’) n = int(f.readline()) nums = [int(i) for i in f] cnt = 0 for i in range(n): for j in range(i + 1, n): if (nums[i] + nums[j]) % 20 == 0 and nums[i] * nums[j] % 5 == 0: cnt += 1 print(cnt)
Эффективное решение:
f = open(’1_B.txt’) k = 20 n = int(f.readline()) # Список количеств чисел, где первый индекс - кратность 5 (0 - не кратно, 1 - кратно), # а второй индекс - остаток от деления на 20 nums = [[0] * k for _ in range(2)] cnt = 0 for i in range(n): x = int(f.readline()) ost = (k - (x % k)) % k # Если x кратен 5, к нему в пару можно ставить как кратные 5, так и не кратные 5 числа if x % 5 == 0: cnt += nums[0][ost] + nums[1][ost] nums[1][x % k] += 1 # Если x не кратен 5, к нему в пару можно ставить только кратные 5 числа else: cnt += nums[1][ost] nums[0][x % k] += 1 print(cnt)
Ошибка.
Попробуйте повторить позже
На вход программы поступает последовательность из натуральных чисел. Рассматриваются все пары различных элементов последовательности, у которых одинаковые остатки от деления на и хотя бы одно из чисел делится на . Необходимо найти и вывести максимальную сумму элементов пары среди таких пар. В ответ запишите числа через пробел: ответ для файла А и ответ для файла В.
Решение 1 (неэффективное)
f = open("27A.txt") n = int(f.readline()) a = [int(f.readline()) for x in range(n)] ans = 0 for i in range(n): for j in range(i + 1, n): if a[i] % 29 == a[j] % 29: if (a[i] % 17 == 0) or (a[j] % 17 == 0): ans = max(ans, a[i] + a[j]) print(ans)
Решение 2 (эффективное)
file = open(’file_B.txt’, ’rt’, encoding=’utf-8’) n = int(file.readline()) ans = -1 maxim_krat_17 = [-1] * 29 maxim_nekrat_17 = [-1] * 29 for i in range(n): x = int(file.readline()) ost = x % 29 if x % 17 == 0: ans = max(ans, maxim_nekrat_17[ost] + x, maxim_krat_17[ost] + x) maxim_krat_17[ost] = max(maxim_krat_17[ost], x) else: ans = max(ans, maxim_krat_17[ost] + x) maxim_nekrat_17[ost] = max(maxim_nekrat_17[ost], x) print(ans)
Ошибка.
Попробуйте повторить позже
Дана последовательность из целых положительных чисел. Необходимо определить максимальное произведение пары элементов этой последовательности, произведение которой кратно , а сумма кратна .
В первой строке входных данных задаётся количество чисел N (1 N 10000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000.
В ответе укажите два числа через пробел: сначала искомое произведение для файла A, а затем для файла B.
Решение 1 (неэффективное)
f = open("3.txt") n = int(f.readline()) a = [int(f.readline()) for x in range(n)] ans = 0 for i in range(n): for j in range(i + 1, n): if ((a[i] * a[j]) % 15 == 0) and ((a[i] + a[j]) % 53 == 0): ans = max(ans, a[i] * a[j]) print(ans)
Решение 2 (эффективное)
file = open(’3.txt’, ’rt’) n = int(file.readline()) max_kr_15 = [0] * 53 max_kr_5 = [0] * 53 max_kr_3 = [0] * 53 max_nekr = [0] * 53 ans = 0 for i in range(n): x = int(file.readline()) ost = x % 53 dop = (53 - ost) % 53 if x % 15 == 0: maxim = max(max_kr_15[dop], max_kr_5[dop], max_kr_3[dop], max_nekr[dop]) ans = max(ans, x * maxim) max_kr_15[ost] = max(max_kr_15[ost], x) elif x % 5 == 0: maxim = max(max_kr_15[dop], max_kr_3[dop]) ans = max(ans, x * maxim) max_kr_5[ost] = max(max_kr_5[ost], x) elif x % 3 == 0: maxim = max(max_kr_15[dop], max_kr_5[dop]) ans = max(ans, x * maxim) max_kr_3[ost] = max(max_kr_3[ost], x) else: ans = max(ans, x * max_kr_15[dop]) max_nekr[ost] = max(max_nekr[ost], x) print(ans)
Решение 3 (эффективное)
f = open(’2_B.txt’) k = 53 p = 15 # Делители числа p d = [15, 5, 3, 1] n = int(f.readline()) # Создаём список, где индексы элемента nums[x][y] обозначают следующее: # x - индекс делителя числа p, на которое делится элемент # y - остаток от деления элемента на k # Элементами же списка являются максимальные числа, # делящиеся на определенный делитель числа p # и имеющие определенный остаток от деления на k nums = [[-10 ** 10] * k for _ in range(p + 1)] mx = -10 ** 10 for i in range(n): x = int(f.readline()) # Вычисляем остаток от деления на k числа-пары для x ost = (k - (x % k)) % k # Ищем наибольший делитель, на который делится x for j in d: if x % j == 0: # Обновляем максимум, умножая x на самое большое число, # при умножении x на которое их произведение будет кратно p mx = max(mx, x * nums[p // j][ost]) break # Заполняем список максимальных чисел nums for j in d: if x % j == 0: # Если x больше предыдущего числа кратному dl с таким же # остатком от деления на k - обновляем число в списке nums[j][x % k] = max(nums[j][x % k], x) print(mx)
Ошибка.
Попробуйте повторить позже
На вход подаётся последовательность из натуральных чисел, каждое из которых не больше . Напишите программу, вычисляющую количество пар элементов последовательности, сумма которых делится на или , произведение кратно и хотя бы одно число из пары больше , находящихся на расстоянии не меньше .
Формат входных данных
В первой строке дано количество чисел , в каждой из последующих строк записано одно натуральное число, не превышающее .
Формат выходных данных
В ответе запишите два числа через пробел: сначала искомое количество для файла A, затем для файла B.
Пример:
10
56
84
26
81
28
93
60
29
72
36
Ответом для примера будет:
Решение 1 (неэффективное)
f = open("27A.txt") n = int(f.readline()) a = [int(f.readline()) for x in range(n)] ans = 0 for i in range(n): for j in range(i + 5, n): if ((a[i] + a[j]) % 5 == 0) or ((a[i] + a[j]) % 7 == 0): if (a[i] * a[j]) % 6 == 0: if (a[i] > 40) or (a[j] > 40): ans += 1 print(ans)
Решение 2 (эффективное)
f = open(’3_B.txt’) s = 5 # Расстояние между элементами p = 6 # Чему должно быть кратно произведение d = [6, 3, 2, 1] # Делители числа p n = int(f.readline()) x = [int(i) for i in f] # Списки с количествами чисел, удовлетворяющих определенным условием # Индексы числа nums_{k}[x][y][z] обозначают следующее: # x - больше ли число чем 40 (0 - нет, 1 - да) # y - делитель из списка d, которому кратно число # z - остаток от деления числа на k nums_5 = [[[0] * 5 for _ in range((p + 1))] for _ in range(2)] nums_7 = [[[0] * 7 for _ in range((p + 1))] for _ in range(2)] nums_35 = [[[0] * 35 for _ in range((p + 1))] for _ in range(2)] cnt = 0 for i in range(s, n): # Элемент, находящийся на расстоянии s от текущего t = x[i - s] # Заполняем списки, увеличивая количества чисел по условиям for j in d: if t % j == 0: nums_5[int(t > 40)][j][t % 5] += 1 nums_7[int(t > 40)][j][t % 7] += 1 nums_35[int(t > 40)][j][t % 35] += 1 # Вычисляем остатки от деления на {k}, которыми должны обладать пары для текущего числа ost_5 = (5 - (x[i] % 5)) % 5 ost_7 = (7 - (x[i] % 7)) % 7 ost_35 = (35 - (x[i] % 35)) % 35 # Если текущее число больше 40, его можно ставить в пару с числами и больше и меньше 40 if x[i] > 40: # Ищем наибольший делитель, на который делится текущее число for j in d: if x[i] % j == 0: # Вычисляем необходимый парный делитель для числа-пары dl = p // j # Количество чисел, которые делится на 5 или на 7, равносильно # сумме количества чисел, делящихся на 5, и количества чисел, делящихся на 7, # из которых вычли количество чисел, делящихся на 35 for r in range(2): cnt += nums_5[r][dl][ost_5] + nums_7[r][dl][ost_7] - nums_35[r][dl][ost_35] break # Если текущее число не больше 40, его можно ставить только в пары к числам больше 40 else: for j in d: dl = p // j if x[i] % j == 0: cnt += nums_5[1][dl][ost_5] + nums_7[1][dl][ost_7] - nums_35[1][dl][ost_35] break print(cnt)
Ошибка.
Попробуйте повторить позже
Имеется набор данных из N натуральных чисел. Требуется найти наибольшую сумму пары, конкатенация которых будет являться палиндромом. Если такой суммы нет — напечатайте 0.
В первой строке входных данных задаётся количество чисел N (1 N 9999). В каждой из последующих N строк записано одно целое положительное число, строго меньшее 10 000.
Пример входных данных:
5
3
5
5
3
10
Выходные данные для приведённого выше примера: 10
В ответе укажите два числа: сначала значение для файла А, затем для файла B.
Переборное решение:
f = open(’4_A.txt’) n = int(f.readline()) x = [int(i) for i in f] mx = 0 for i in range(n): for j in range(i + 1, n): s1 = str(x[i]) + str(x[j]) s2 = str(x[j]) + str(x[i]) if s1 == s1[::-1] or s2 == s2[::-1]: mx = max(mx, s1 + s2) print(mx)
Эффективное решение:
pali = [] for i in range(6): pali.append([str(i) for i in range(10**i, 10**(i+1)+1) if str(i) == str(i)[::-1]]) n = int(input()) mask = [0]*10000 for i in range(n): mask[int(input())] += 1 ans = 0 for k in range(10000): if mask[k] >= 1: s = str(k) for i in range(len(s)): s1 = s[i:len(s)][::-1] if s != s1: if mask[int(s1)] >= 1: if s + s1 == (s + s1)[::-1]: if int(s) + int(s1) > ans: ans = int(s)+int(s1) else: if mask[int(s1)] >= 2: if s + s1 == (s + s1)[::-1]: ans = int(s)+int(s1) s1 = s[::-1] s2 = ’’ for i in range(8-len(s + s1)): for j in range(len(pali[i])): s2 = pali[i][j] + s1 if len(s2) > 4: break if mask[int(s2)] >= 1: if s + s2 == (s + s2)[::-1]: if int(s)+int(s2) > ans: ans = int(s)+int(s2) print(ans)
Ошибка.
Попробуйте повторить позже
Имеется набор данных из натуральных чисел. Рассматриваются все пары различных элементов последовательности. Необходимо определить количество пар, в которых оба числа является палиндромами.
В первой строке входных данных задаётся количество чисел (1 N 9999). В каждой из последующих строк записано одно целое положительное число, строго меньшее .
Пример входных данных:
4
11
22
39
99
Выходные данные для приведённого выше примера:
В ответе укажите два числа через пробел: сначала значение для файла А, затем для файла B.
Переборное решение:
f = open(’4_A.txt’) n = int(f.readline()) x = [int(i) for i in f] cnt = 0 for i in range(n): for j in range(i + 1, n): s1 = str(x[i]) s2 = str(x[j]) if s1 == s1[::-1] and s2 == s2[::-1]: cnt += 1 print(cnt)
Эффективное решение:
n = int(input()) count_of_palis = 0 # Количество палиндромов ans = 0 for i in range(n): x = int(input()) if str(x) == str(x)[::-1]: # Если число - палиндром, оно образует пары со всеми ранее встреченными палиндромами ans += count_of_palis # Увеличиваем количество палиндромов count_of_palis += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Имеется набор данных из целых чисел. Рассматриваются все пары различных элементов последовательности. Необходимо определить количество таких пар, произведение которых будет кратно и сумма кратна .
В первой строке входных данных задаётся количество чисел . В каждой из последующих строк записано одно целое положительное число, не превышающее .
Пример входных данных:
5
3
315
0
159
1
Выходные данные для приведённого выше примера: 2
В ответе укажите через пробел два числа: сначала значение искомого количества для файла А, затем для файла B.
Переборное решение:
f = open(’6_A.txt’) n = int(f.readline()) nums = [int(i) for i in f] cnt = 0 for i in range(n): for j in range(i + 1, n): if (nums[i] + nums[j]) % 53 == 0 and nums[i] * nums[j] % 3 == 0: cnt += 1 print(cnt)
Эффективное решение:
f = open(’6_B.txt’) k = 53 n = int(f.readline()) # Список количеств чисел, где первый индекс - кратность 3 (0 - не кратно, 1 - кратно), # а второй индекс - остаток от деления на k nums = [[0] * k for _ in range(2)] cnt = 0 for i in range(n): x = int(f.readline()) ost = (k - (x % k)) % k # Если x кратен 3, к нему в пару можно ставить как кратные 3, так и не кратные 3 числа if x % 3 == 0: cnt += nums[0][ost] + nums[1][ost] nums[1][x % k] += 1 # Если x не кратен 3, к нему в пару можно ставить только кратные 3 числа else: cnt += nums[1][ost] nums[0][x % k] += 1 print(cnt)
Ошибка.
Попробуйте повторить позже
В текстовом файле записан набор натуральных чисел, не превышающих . Гарантируется, что все числа различны. Из набора нужно выбрать три числа, так чтобы чисел, больших было не более . Сколько троек, подходящих под условие задачи можно найти?
Первая строка входного файла содержит натуральное число — общее количество чисел в файле. Каждая из следующих строк содержит одно число.
Пример входного файла:
Для данного примера в ответе нужно записать (подходят все тройки, т.к. ни в одной из них нет больше -х чисел, больших ).
Вам даны два входных файла, каждый из которых имеет описанную выше структуру. В ответе укажите два числа, ответ для файла и для файла .
Решение 1. Неэффективное
f = open("27-A.txt") n = int(f.readline()) a = [] for i in range(n): a.append(int(f.readline())) k = 0 for i in range(n): for j in range(i + 1, n): for l in range(j + 1, n): if (a[i] > 1000) + (a[j] > 1000) + (a[l] > 1000) <= 2: k += 1 print(k)
Решение 2. Эффективное. Динамика
f = open("27-B.txt") n = int(f.readline()) pairs = [0] * 3 # pairs[i] - кол-во пар на свалке, где в паре i чисел > 1000 numbers = [0] * 2 # numbers[0] - кол-во чисел на свалке, которые <= 1000 # numbers[1] - кол-во чисел на свалке, которые > 1000 ans = 0 for i in range(n): x = int(f.readline()) if x <= 1000: ans += pairs[0] + pairs[1] + pairs[2] else: ans += pairs[0] + pairs[1] t = x > 1000 # True(1),когда x > 1000, False(0) иначе for j in range(2): pairs[j + t] += numbers[j] numbers[t] += 1 print(ans)
Решение 3. Эффективное. Статика
f = open("27-B.txt") n = int(f.readline()) more = 0 for i in range(n): x = int(f.readline()) more += (x > 1000) less = n - more print(more * (more - 1) * less // 2 + more * less * (less - 1) // 2 + less * (less - 1) * (less - 2) // 6) f.close()
Ошибка.
Попробуйте повторить позже
В текстовом файле записан набор натуральных чисел, не превышающих . Гарантируется, что все числа различны. Из набора нужно выбрать три числа, так чтобы произведение чисел было кратно , а их сумма кратна . Сколько троек, подходящих под условие задачи можно найти?
Первая строка входного файла содержит натуральное число — общее количество чисел в файле. Каждая из следующих строк содержит одно число.
Пример входного файла:
Для данного примера в ответе нужно записать (подходит тройка (). Произведение элементов тройки кратно , а их сумма кратна ).
Вам даны два входных файла, каждый из которых имеет описанную выше структуру. В ответе укажите два числа, ответ для файла и для файла .
Решение 1. Неэффективное
f = open("27-A.txt") n = int(f.readline()) a = [] for i in range(n): a.append(int(f.readline())) k = 0 for i in range(n): for j in range(i + 1, n): for l in range(j + 1, n): if (((a[i] * a[j] *a[l]) % 27 == 0) and ((a[i] + a[j] + a[l]) % 10 == 0)): k += 1 print(k)
Решение 2. Эффективное. Динамика
f = open(’7_B.txt’) n = int(f.readline()) a = [int(i) for i in f] k = 10 # Чему должна быть кратна сумма p = 27 # Чему должно быть кратно произведение d = [27, 9, 3, 1] # Делители числа p в порядке убывания # Список с количествами чисел, удовлетворяющих определенным условием # Индексы числа nums[x][y] обозначают следующее: # x - максимальный делитель из списка d, которому кратно число # y - остаток от деления числа на k nums = [[0] * k for _ in range(p + 1)] # Список с количествами пар чисел, удовлетворяющих определенным условием # Индексы числа pairs[x][y] обозначают следующее: # x - максимальный делитель из списка d, которому кратно произведение пары # y - остаток от деления суммы чисел пары на k pairs = [[0] * k for _ in range(p + 1)] cnt = 0 for i in range(2, len(a)): ost1 = a[i - 2] % k # Остаток от деления на k первого числа тройки # Находим максимальный делитель из d, которому кратно число for dl in d: if a[i - 2] % dl == 0: # Увеличиваем количество чисел с такими характеристиками nums[dl][ost1] += 1 break # Составляем со вторым числом пары с числами из всех возможных категорий делителей for dl_num in d: # Ищем максимальный делитель из d, которому кратно произведение пары for dl_pair in d: if (dl_num * a[i - 1]) % dl_pair == 0: # Увеличиваем количество пар для всех возможных остатков for j in range(k): pairs[dl_pair][(j + a[i - 1]) % k] += nums[dl_num][j] break # Остаток, которым должна обладать сумма пары при делении на 10 ost3 = (k - (a[i] % k)) % k # Составляем тройки со всеми подходящими под условие парами for dl_tr in d: if a[i] % dl_tr == 0: cnt += pairs[p // dl_tr][ost3] print(cnt)
Ошибка.
Попробуйте повторить позже
В текстовом файле записан набор натуральных чисел, не превышающих . Гарантируется, что все числа различны. Из набора нужно выбрать три числа, так чтобы произведение чисел было кратно , их сумма кратна и также ровно числа из тройки должны быть больше . Сколько троек, подходящих под условие задачи можно найти?
Первая строка входного файла содержит натуральное число — общее количество чисел в файле. Каждая из следующих строк содержит одно число.
Пример входного файла:
Для данного примера в ответе нужно записать (подходит тройка (). Произведение элементов тройки кратно , их сумма кратна , и ровно числа больше ).
Вам даны два входных файла, каждый из которых имеет описанную выше структуру. В ответе укажите два числа, ответ для файла и для файла .
Решение 1. Неэффективное
f = open("27-A.txt") n = int(f.readline()) a = [] for i in range(n): a.append(int(f.readline())) k = 0 for i in range(n): for j in range(i + 1, n): for l in range(j + 1, n): if (((a[i] * a[j] *a[l]) % 12 == 0) and ((a[i] + a[j] + a[l]) % 24 == 0) and ((a[i] > 128) + (a[j] > 128) + (a[l] > 128)) == 2): k += 1 print(k)
Решение 2. Эффективное. Динамика
f = open(’8_B.txt’) n = int(f.readline()) a = [int(i) for i in f] k = 24 # Чему должна быть кратна сумма p = 12 # Чему должно быть кратно произведение d = [12, 6, 4, 3, 2, 1] # Делители числа p в порядке убывания # Список с количествами чисел, удовлетворяющих определенным условием # Индексы числа nums[x][y][z] обозначают следующее: # x - больше ли число чем 128 (1 - да, 0 - нет) # y - максимальный делитель из списка d, которому кратно число # z - остаток от деления числа на k nums = [[[0] * k for _ in range(p + 1)] for _ in range(2)] # Список с количествами пар чисел, удовлетворяющих определенным условием # Индексы числа pairs[x][y][z] обозначают следующее: # x - количество чисел в паре больше 128 # y - максимальный делитель из списка d, которому кратно произведение пары # z - остаток от деления суммы чисел пары на k pairs = [[[0] * k for _ in range(p + 1)] for _ in range(3)] cnt = 0 for i in range(2, len(a)): ost1 = a[i - 2] % k # Остаток от деления на k первого числа тройки # Находим максимальный делитель из d, которому кратно число for dl in d: if a[i - 2] % dl == 0: # Увеличиваем количество чисел с такими характеристиками nums[int(a[i - 2] > 128)][dl][ost1] += 1 break # Составляем со вторым числом пары с числами из всех возможных категорий делителей for dl_num in d: # Ищем максимальный делитель из d, которому кратно произведение пары for dl_pair in d: if (dl_num * a[i - 1]) % dl_pair == 0: # Увеличиваем количество пар для всех возможных остатков for j in range(k): for h in range(2): pairs[h + int(a[i - 1] > 128)][dl_pair][(j + a[i - 1]) % k] += nums[h][dl_num][j] break # Остаток, которым должна обладать сумма пары при делении на 10 ost3 = (k - (a[i] % k)) % k # Составляем тройки со всеми подходящими под условие парами for dl_tr in d: if a[i] % dl_tr == 0: cnt += pairs[2 - int(a[i] > 128)][p // dl_tr][ost3] print(cnt)
Ошибка.
Попробуйте повторить позже
Имеется набор данных из целых чисел. Рассматриваются все пары различных элементов последовательности. Необходимо определить количество пар, сумма которых не будет кратна и произведение которых не будет кратно .
В первой строке входных данных задаётся количество чисел . В каждой из последующих строк записано одно целое положительное число, не превышающее .
Пример входных данных:
Выходные данные для приведённого выше примера:
В ответе укажите два числа: сначала значение искомого количества для файла , затем для файла .
Переборное решение:
f = open("9_A.txt") n = int(f.readline()) a = [] for i in range(n): a.append(int(f.readline())) cnt = 0 for i in range(n): for j in range(i + 1, n): if (a[i] + a[j]) % 10 != 0 and (a[i] * a[j]) % 8 != 0: cnt += 1 print(cnt)
Эффективное решение:
f = open(’9_B.txt’) k = 10 # Чему НЕ должна быть кратна сумма p = 8 # Чему НЕ должно быть кратно произведение d = [8, 4, 2, 1] # Делители числа p в порядке убывания n = int(f.readline()) # Список с количествами чисел, удовлетворяющих определенным условием # Индексы числа nums[x][y] обозначают следующее: # x - максимальный делитель из списка d, которому кратно число # y - остаток от деления числа на k nums = [[0] * k for _ in range(p + 1)] cnt = 0 for i in range(n): x = int(f.readline()) # Вычисляем остаток от деления на k числа-пары для x ost = (k - (x % k)) % k # Увеличиваем ответ на количество пар с x, # произведение с которыми будет не кратно p, а сумма не кратна k for j in d: if (x * j) % p != 0: for h in range(k): if h != ost: cnt += nums[j][h] # Находим максимальный делитель из d, которому кратно число for j in d: if x % j == 0: # Увеличиваем количество чисел с такими характеристиками nums[j][x % k] += 1 break print(cnt)
Ошибка.
Попробуйте повторить позже
Дано число , затем натуральных чисел. Найдите количество пар элементов, где оба элемента будут являться различными числами, при этом оба числа являются полными квадратами.
Входные данные
В первой строке подается натуральное число . В каждой строке после записано одно натуральное число, не превышающее .
Переборное решение:
f = open("10_A.txt") n = int(f.readline()) a = [] for i in range(n): a.append(int(f.readline())) cnt = 0 for i in range(n): for j in range(i + 1, n): if a[i] != a[j] and a[i] ** 0.5 == int(a[i] ** 0.5) and a[j] ** 0.5 == int(a[j] ** 0.5): cnt += 1 print(cnt)
Эффективное решение:
f = open(’10_B.txt’) n = int(f.readline()) # Список количеств чисел, где индекс равен корню из числа # Например, под индексом 7 хранится количество чисел 49 nums = [0] * 101 count = 0 # Общее количество чисел-квадратов ans = 0 for i in range(n): x = int(f.readline()) # Проверяем, является ли текущее число полным квадратом if x ** 0.5 == int(x ** 0.5): # Так как числа должны быть разными, x составляет пары со всеми # встреченными до этого полными квадратами, кроме равных себе чисел ans += count - nums[int(x ** 0.5)] # Увеличиваем количество встреченных чисел x nums[int(x ** 0.5)] += 1 # Увеличиваем общее количество квадратов count += 1 print(ans)
Ошибка.
Попробуйте повторить позже
Дано число , затем натуральных чисел. Найдите количество пар элементов, где оба элемента будут являться различными числами, при этом хотя бы одно число является полным квадратом.
Входные данные
В первой строке подается натуральное число . В каждой строке после записано одно натуральное число, не превышающее .
Переборное решение:
f = open("11_A.txt") n = int(f.readline()) a = [] for i in range(n): a.append(int(f.readline())) cnt = 0 for i in range(n): for j in range(i + 1, n): if a[i] != a[j] and (a[i] ** 0.5 == int(a[i] ** 0.5) or a[j] ** 0.5 == int(a[j] ** 0.5)): cnt += 1 print(cnt)
Эффективное решение:
f = open(’11_B.txt’) n = int(f.readline()) # Список количеств чисел, где индекс равен корню из числа # Например, под индексом 7 хранится количество чисел 49 nums = [0] * 101 count = 0 # Общее количество квадратов ans = 0 for i in range(n): x = int(f.readline()) # Проверяем, является ли текущее число полным квадратом if x ** 0.5 == int(x ** 0.5): # Так как числа должны быть разными, x составляет пары со всеми # встреченными до этого числами, исключая самого себя ans += i - nums[int(x ** 0.5)] # Увеличиваем количество встреченных чисел x nums[int(x ** 0.5)] += 1 # Увеличиваем общее количество квадратов count += 1 else: # Если x не полный квадрат, он составляет пары со всеми квадратами ans += count print(ans)
Ошибка.
Попробуйте повторить позже
Дано число затем натуральных чисел. Найдите количество пар чисел, где произведение чисел будет кратно , но некратно , а сумма будет иметь остаток при делении на .
Входные данные
В первой строке подается натуральное число . В каждой строке после записано одно натуральное число, не превышающее .
Переборное решение:
f = open("12_A.txt") n = int(f.readline()) a = [] for i in range(n): a.append(int(f.readline())) cnt = 0 for i in range(n): for j in range(i + 1, n): if a[i] * a[j] % 8 == 0 and a[i] * a[j] % 16 != 0 and (a[i] + a[j]) % 10 == 4: cnt += 1 print(cnt)
Эффективное решение:
f = open(’12_B.txt’) k = 10 # Остаток от деления на что должен быть равен 4 p = 8 # Чему должно быть кратно произведение d = [8, 4, 2, 1] # Делители числа p в порядке убывания n = int(f.readline()) # Список с количествами чисел, удовлетворяющих определенным условием # Индексы числа nums[x][y] обозначают следующее: # x - максимальный делитель из списка d, которому кратно число # y - остаток от деления числа на k nums = [[0] * k for _ in range(p + 1)] cnt = 0 for i in range(n): x = int(f.readline()) # Вычисляем остаток от деления на k числа-пары для x ost = ((k + 4) - (x % k)) % k # Увеличиваем ответ на количество пар с x, # произведение с которыми будет кратно p, не кратно 16, # а сумма даст остаток 4 при делении на 10 for j in d: if x % j == 0 and (x * (p // j)) % 16 != 0: cnt += nums[p // j][ost] # Находим максимальный делитель из d, которому кратно число for j in d: if x % j == 0: # Увеличиваем количество чисел с такими характеристиками nums[j][x % k] += 1 break print(cnt)
Ошибка.
Попробуйте повторить позже
Имеется набор данных, состоящий из положительных целых чисел. Необходимо определить количество пар элементов этого набора, в которых и сумма элементов нечётна, а произведение делится на 13.
Входные данные: Даны два входных файла (файл и файл ), каждый из которых содержит в первой строке количество чисел Каждая из следующих строк содержит натуральное число, не превышающее 1000.
Пример входного файла:
5
4
13
27
39
7
Для указанных входных данных количество подходящих пар должно быть равно 2. В приведённом наборе имеются две пары (4, 13) и (4, 39), сумма элементов которых нечётна, и произведение кратно 13.
В ответе укажите два числа через пробел: сначала количество подходящих пар для файла затем для файла
Для А
s = open(’27-4a.txt’, ’r’).readlines()[1:] arr = [] for i in range(len(s)): arr.append(int(s[i])) n = len(arr) cnt = 0 for i in range(n - 1): for j in range(i + 1, n): if (arr[i]*arr[j]) % 13 == 0 and (arr[i]+arr[j]) % 2 != 0: cnt += 1 print(cnt)
Для Б
f = open(’13_B.txt’) k = 2 # Остаток от деления на что должен быть 1 p = 13 # Чему должно быть кратно произведение n = int(f.readline()) # Список количеств чисел, где первый индекс - кратность p (0 - не кратно, 1 - кратно), # а второй индекс - остаток от деления на k nums = [[0] * k for _ in range(2)] cnt = 0 for i in range(n): x = int(f.readline()) # Чтобы сумма была нечетной, четность элементов должна быть разной ost = int(not (x % 2)) # Если x кратен p, к нему в пару можно ставить как кратные p, так и не кратные p числа if x % p == 0: cnt += nums[0][ost] + nums[1][ost] nums[1][x % k] += 1 # Если x не кратен p, к нему в пару можно ставить только кратные p числа else: cnt += nums[1][ost] nums[0][x % k] += 1 print(cnt)
Ошибка.
Попробуйте повторить позже
Дано число N, затем N натуральных чисел. Требуется найти максимальное четное произведение двух чисел кратное 27.
Входные данные: Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество пар . Каждая из следующих N строк содержит натуральное число, не превышающее 1000.
В ответе укажите два числа: значение для файла А, затем, через пробел, для файла Б.
Для А
s = open(’27-5a.txt’, ’r’).readlines()[1:] arr = [] for i in range(len(s)): arr.append(int(s[i])) print(arr) n = len(arr) mx = -1 for i in range(n - 1): for j in range(i + 1, n): if (arr[i]*arr[j]) % 27 == 0 and (arr[i]*arr[j]) % 2 == 0: mx = max(mx, arr[i]*arr[j]) print(mx)
Для Б
f = open(’14_B.txt’) # Если произведение должно быть четным и кратным 27, # значит оно должно быть кратно 27 * 2 = 54 p = 54 d = [54, 27, 18, 9, 6, 3, 2, 1] # Делители числа p n = int(f.readline()) # Создаём список, где индекс элемента nums[x] обозначает следующее: # x - делитель числа p, на которое делится элемент # Элементами же списка являются максимальные числа, # делящиеся на определенный делитель числа p nums = [-10 ** 10] * (p + 1) mx = -10 ** 10 for i in range(n): x = int(f.readline()) # Ищем наибольший делитель, на который делится x for j in d: if x % j == 0: # Обновляем максимум, умножая x на самое большое число, # при умножении x на которое их произведение будет кратно p mx = max(mx, x * nums[p // j]) # Заполняем список максимальных чисел nums for j in d: if x % j == 0: # Если x больше предыдущего числа кратному dl nums[j] = max(nums[j], x) break print(mx)
- 694710 999000
Ошибка.
Попробуйте повторить позже
На вход программы поступает последовательность из N целых положительных чисел. Рассматриваются все пары различных элементов последовательности. Необходимо определить количество пар чисел, произведение которых кратно 7, а сумма нечётна.
В ответе укажите два числа: сначала значение для файла А, затем через пробел значение для файла B.
Переборное решение:
f = open(’15_A.txt’) n = int(f.readline()) nums = [int(i) for i in f] cnt = 0 for i in range(n): for j in range(i + 1, n): if (nums[i] + nums[j]) % 2 != 0 and nums[i] * nums[j] % 7 == 0: cnt += 1 print(cnt)
Эффективное решение:
f = open(’15_B.txt’) k = 2 # Остаток от деления на что должен быть 1 p = 7 # Чему должно быть кратно произведение n = int(f.readline()) # Список количеств чисел, где первый индекс - кратность p (0 - не кратно, 1 - кратно), # а второй индекс - остаток от деления на k nums = [[0] * k for _ in range(2)] cnt = 0 for i in range(n): x = int(f.readline()) # Чтобы сумма была нечетной, четность элементов должна быть разной ost = int(not (x % 2)) # Если x кратен p, к нему в пару можно ставить как кратные p, так и не кратные p числа if x % p == 0: cnt += nums[0][ost] + nums[1][ost] nums[1][x % k] += 1 # Если x не кратен p, к нему в пару можно ставить только кратные p числа else: cnt += nums[1][ost] nums[0][x % k] += 1 print(cnt)