Pascal. Задача 8-43

Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности, находящихся на расстоянии не меньше 10 (разница в индексах элементов должна быть 10 или более). Необходимо определить количество пар, произведение чисел в которых кратно 10.

Входные данные: Дан входной файл, первой строке входных данных задаётся количество чисел N< (10 ≤ N ≤ 100000). В каждой из последующих N строк записано одно натуральное число, не превышающее 10 000.

Пример входных данных:
12
1
5
5
8
9
4
12
14
6
7
9
8

Пример выходных данных для приведённого выше примера входных данных: 1

Пояснение. Из 12 чисел можно составить 3 пары, удовлетворяющие условию. Это будут элементы с индексами 1 и 11, 1 и 12, 2 и 12. Для заданного набора чисел получаем пары (1, 9), (1, 8), (5, 8). Произведения чисел в этих парах равны 9, 8, 40. На 10 делится одно из этих произведений.

Ответ
1339367564
Решение
const
  K = 10; // Расстояние между элементами произведений
var
  a: array[1..K] of integer;
  N, X, i, ci, cnt, m1, m2, m5, m10 : integer;
  f : text;
begin
  Assign(f, 'C:\PABCWork.NET\test-8-41-1.txt');
  Reset(f);
  Readln(f, N); // Ввод из первой строки
  // Заполнение циклического буфера
  for i := 1 to K do Readln(f, a[i]);
  m1:= 0; // счетчик чисел
  m2:= 0; // счетчик множителей кратных 2
  m5:= 0; // счетчик множителей кратных 5
  m10:= 0; // счетчик множителей кратных 10
  cnt := 0; // Счетчик произведений кратных 10
  // Подсчет произведений
  for i := K + 1 to N do begin
    ci := (i - 1) mod K + 1; // индекс буфера
    Readln(f, X);
    if a[ci] mod 10 = 0 then Inc(m10);
    if a[ci] mod 5 = 0 then Inc(m5);
    if a[ci] mod 2 = 0 then Inc(m2);
    Inc(m1);
    if X mod 10 = 0 then cnt := cnt + m1
    else if X mod 5 = 0 then cnt := cnt + m2
         else if X mod 2 = 0 then cnt := cnt + m5
              else cnt := cnt + m10;
    a[ci] := X;
  end;
  Close(f);
  Writeln(cnt);
end.