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 делится одно из этих произведений.
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.