Содержание верного ответа и указания по оцениванию
(допускаются иные формулировки ответа, не искажающие его смысла)
Описание алгоритма. Произведение двух чисел делится на если выполнено одно из следующих условий (условия не могут выполняться одновременно). - Оба сомножителя делятся на
- Один из сомножителей делится на , а другой не делится.
- Ни один из сомножителей не делится на , но один сомножитель делится на , а другой – на .
При вводе данных можно определять, делится ли каждое из чисел на , и , и подсчитывать следующие значения: - – количество чисел, кратных ;
- – количество чисел, кратных , но не кратных ;
- – количество чисел, кратных , но не кратных .
Сами числа при этом можно не хранить. Каждое число учитывается не более чем в одном из счётчиков.
Количество пар, удовлетворяющих условию 1), можно вычислить по формуле
Количество пар, удовлетворяющих условию 2), можно вычислить по формуле
Количество пар, удовлетворяющих условию 3), можно вычислить по формуле
Поэтому искомое количество пар вычисляется по формуле
Пример правильной программы на языке PascalABC с комментариями:
var
N: integer;
a: integer;
n51, n17, n3: integer;
k51: integer;
i: integer;
begin
readln(N);
n51:=0; n17:=0; n3:=0;
for i:=1 to N do begin
readln(a);
if a mod 51 = 0 then
inc(n51)
else if a mod 17 = 0 then
inc(n17)
else if a mod 3 = 0 then
inc(n3);
end;
k51 := n51*(n51-1) div 2 + n51*(N-n51) + n3*n17;
writeln(k51);
end.
- При таком решении каждое прочитанное число обрабатывается (делаются проверки делимости, изменяются счётчики) и после этого не хранится. Таким образом, используемая память не зависит от длины последовательности. Время обработки очередного числа фиксировано, т.е. не зависит от длины последовательности. Время заключительных вычислений по приведённой в решении формуле также не зависит от длины последовательности. Поэтому при увеличении длины последовательности в раз время работы программы увеличивается не более чем в раз. Таким образом, приведённая выше программа эффективна как по времени, так и по используемой памяти. Это решение оценивается баллами.
- Общая идея решения, эффективного по времени, состоит в следующем. Просматриваем по очереди все элементы последовательности и накапливаем значения вспомогательных величин. После того как вся последовательность обработана и подсчитаны окончательные значения вспомогательных величин, по этим значениям подсчитывается искомое количество пар. При этом можно использовать и другие вспомогательные величины. Все подобные программы оцениваются в балла.
- Возможно решение, основанное на описанных идеях, однако предварительно сохраняющее элементы последовательности в массив. Такое решение (если в нём нет ошибок) эффективно по времени, но неэффективно по памяти. Оно оценивается в балла.
- Решение, не эффективное ни по времени, ни по памяти, запоминает входную последовательность в массиве, после чего явно перебирает все возможные пары. Такое решение оценивается в балла (см. критерии).
Если в работе представлены две программы решения задачи, то каждая из них независимо оценивается по указанным ниже критериям, итоговой считается большая из двух оценок. Описание алгоритма решения не оценивается.