Задание №27 ЕГЭ Информатика с ответом и решением
Ответ: 19 199360639
Условие
На вход программы поступает последовательность из N целых положительных чисел. Рассматриваются все пары различных элементов последовательности (элементы пары не обязаны стоять в последовательности рядом, порядок элементов в паре не важен). Необходимо определить количество пар, для которых произведение элементов делится на 26.
В первой строке входных данных задаётся количество чисел N (1 ≤ N ≤ 60 000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000. В качестве результата программа должна напечатать одно число: количество пар, в которых произведение элементов кратно 26.
Входные данные.
Файл A
Файл B
Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество чисел N (1 ≤ N ≤ 60 000). В каждой из последующих N строк записано одно натуральное число, не превышающее 10 000.
Пример организации исходных данных во входном файле:
4
2
6
13
39
Пример выходных данных для приведённого выше примера входных данных:
4
В ответе укажите два числа: сначала значение искомой суммы для файла А, затем для файла B.
Подсказки — как подойти к решению
- Сами числа хранить не нужно: достаточно подсчитать, сколько их в каждой группе по делимости, а количество пар потом вычислить по формулам.
- Разбери, из каких комбинаций сомножителей произведение делится на 26, учитывая, что 26 = 2 · 13. Сделай так, чтобы каждое число попадало ровно в одну группу, иначе одни и те же пары будут учтены несколько раз.
- Пары внутри одной группы считай по формуле числа сочетаний, а пары из разных групп — перемножением счётчиков. В конце проверь, что ни одна пара не посчитана дважды и элемент не образует пару сам с собой.
Решение
Произведение двух чисел делится на 26, если выполнено одно из следующих условий (условия не могут выполняться одновременно).
А. Оба сомножителя делятся на 26.
Б. Один из сомножителей делится на 26, а другой не делится.
В. Ни один из сомножителей не делится на 26, но один сомножитель делится на 2, а другой — на 13.
Примечание для проверяющего. Условие делимости произведения на 26 можно сформулировать проще, например так: (один из сомножителей делится на 26) ИЛИ (один сомножитель делится на 2, а другой — на 13). Но в этом случае пара сомножителей может удовлетворять обоим условиям, что затруднит подсчёт количества пар.
При вводе чисел можно определять, делится ли каждое из них на 26, 2 и 13, и подсчитывать следующие значения:
1) n26 — количество чисел, кратных 26;
2) n13 — количество чисел, кратных 13, но не кратных 26;
3) n2 — количество чисел, кратных 2, но не кратных 26.
Примечание для проверяющего. Сами числа при этом можно не хранить. Каждое число учитывается не более чем в одном из счётчиков. Количество пар, удовлетворяющих условию А, можно вычислить по формуле n26 · (n26 – 1) : 2.
Количество пар, удовлетворяющих условию Б, можно вычислить по формуле n26 · (N – n26).
Количество пар, удовлетворяющих условию В, можно вычислить по формуле n2 · n13.
Поэтому искомое количество пар вычисляется по формуле n26 · (n26 – 1) : 2 + n26 · (N – n26) + n2 · n13.
Приведём решение задачи на языке PascalABC.
var
N: integer; {количество чисел}
a: integer; {очередное число}
n26, n13, n2: integer;
k26: integer; {количество требуемых пар}
i: integer;
f: text;
begin
n26:=0; n13:=0; n2:=0;
assign(f,'27989_A.txt');
reset(f);
readln(f, n);
for i := 1 to n do begin
readln(f, a);
if a mod 26 = 0 then
n26 := n26+1
else if a mod 13 = 0 then
n13 := n13 + 1
else if a mod 2 = 0 then
n2 := n2 + 1;
end;
k26 := n26*(n26-1) div 2 + n26*(N-n26) + n2*n13;
writeln(k26)
end.
Приведём решение Михаила Бурмистрова на языке PascalABC.
var f:text;
a: array [1..100000] of integer;
n,i,j,p,count:integer;
begin
assign(f,'C:\27989_A.txt');
reset(f);
readln(f,n);
for i:=1 to n do readln(f,a[i]);
for i:=1 to n-1 do
for j:=i+1 to n do begin
p:=a[i]*a[j];
if p mod 26 =0 then inc(count);
end;
writeln(count);
end.
В результате работы данного алгоритма при вводе данных из файла A ответ — 19, из файла B — 199360639.
Примечание.
Путь к файлу необходимо указать согласно расположению файла на Вашем компьютере.
Приведём другое решение на языке Python.
f = open("27989_B.txt") # для файла A укажите его название
s = f.readlines()
n = int(s[0])
k = 0
k_0 = 0
k_26 = 0
k_2 = 0
k_13 = 0
for i in range(1, n + 1):
s[i] = int(s[i])
if s[i] % 26 == 0:
k_26 += 1
elif s[i] % 13 == 0:
k_13 += 1
elif s[i] % 2 == 0:
k_2 += 1
else:
k_0 += 1
k = k_26 * k_0 + k_13 * k_2 + k_26 * k_13 + k_26 * k_2 + (k_26 * (k_26 - 1)) // 2
print(k)
Приведём решение Юрия Красильникова на языке Python.
#Решение на питоне, подсчет чисел с разной делимостью:
a=[int(s) for s in open('27989_B.txt')][1:]
m2=len([x for x in a if x%2==0 and x%13!=0])
m13=len([x for x in a if x%13==0 and x%2!=0])
m26=len([x for x in a if x%26==0])
m=len(a)
print(m26*(m26-1)//2 + m26*(m-m26) + m2*m13)
Приведём решение Юрия Красильникова на языке Python.
#Выбираем числа последовательности по очереди и прибавляем к счетчику пар число пар, которое очередное число образует с предыдущими:
a = [int(s) for s in open('27989_B.txt')][1:]
cnts = [0]*4
k = 0 # счетчик количества пар
for x in a:
n = (x%2==0)*2 + (x%13==0) # n=0 - не делится ни на 2, ни на 13.
# n=2 - делится на 2; n=1 - делится на 13; n=3 - делится на 26;
if n == 3:
k += sum(cnts)
elif n != 0:
k += cnts[3-n] + cnts[3]
else: k += cnts[3]
cnts[n] += 1
print(k)
Типичные ошибки
- Значения перепутаны местами: сначала в ответе идёт результат для файла A, затем для файла B.
- Каждая пара посчитана дважды: (a, b) и (b, a) — это одна и та же пара, потому что порядок элементов в паре не важен. Убери двойной учёт.
В тренажёре: подсказки по шагам, разбор твоей ошибки ИИ-репетитором (он не даёт готовый ответ), повторение ошибок по интервалам и общий прогресс. Все задания №27 по информатике