Другие языки программирования и технологии

помогите с информатикой (pascal ABC)\ 10 класс

В массиве из n положительных натуральных чисел, найти кол-во пар, произведение пар чисел которых кратно 6, а числа стоят друг от друга не менее чем на 6 позиций. Программа должна быть эффективной по памяти и по времени. Эффективная программа считается та, которая при увеличении N в K раз увеличивается время и память. Сначала не эффективная программа. Чтобы написать эффективную программу, не надо использовать массив.
Произведение чисел кратно 6, если одно из чисел кратно 6 или если одно число кратно 2, а второе число кратно 3. Так что достаточно хранить три счётчика предшествующих чисел:

1. количество чисел, кратных 6
2. количество чисел, кратных 3
3. количество чисел, кратных 2

Причём эти счётчики должны "отставать" от текущего числа на 6 позиций. Т. е. Если мы обрабатываем число номер 20, то в счётчиках должна быть информация по числам с номерами от 0 до 14 (нумерация с нуля).

А дальше смотрим, кратно ли текущее число 2, 3 и 6. И в зависимости от этого прибавляем счётчики.

function f(arr: array of integer): integer;
var cnt_2, cnt_3, cnt_6, i, res: integer;
begin
cnt_2 := 0; cnt_3 := 0; cnt_6 := 0; res := 0;
for i := 6 to length(arr) - 1 do begin

if arr[i - 6] mod 6 = 0 then inc(cnt_6);
if arr[i - 6] mod 3 = 0 then inc(cnt_3);
if arr[i - 6] mod 2 = 0 then inc(cnt_2);

if arr[i] mod 6 = 0 then
inc(res, i - 5)
else if arr[i] mod 3 = 0 then
inc(res, cnt_2)
else if arr[i] mod 2 = 0 then
inc(res, cnt_3)
else
inc(res, cnt_6);

end;

f := res
end;
ЕК
Евгений Каменев
67 263
Лучший ответ