Pascal. Задача 8-41

На вход программы поступает последовательность из N целых положительных чисел. Известно, что все числа в последовательности различны. Необходимо составить программу, которая подсчитывает количество пар различных элементов последовательности, произведение которых делится на 51. Элементы пары не обязательно должны стоять в последовательности рядом, порядок элементов в паре не важен.

Входные данные: Дан входной файл, в первой строке которого  задаётся количество чисел N (1 ⩽ N ⩽ 10000).
В каждой из последующих NN строк записано одно целое положительное число, не превышающее 10 000.
В качестве результата программа должна напечатать одно число: количество пар, в которых произведение элементов кратно 51.

Пример входных данных:
5
1
2
3
17
51

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

Пояснение. Из пяти заданных чисел можно составить 10 попарных произведений:
1·2 1·3 1·17 1·51 2·3 2·17 2·51 3·17
Из них на 51 делятся 5 произведений
1·51 2·51 3·17 3·51 17·51

 

Ответ
316661180
Решение

Вариант 1. Расчет количества произведений после цикла подсчета чисел, кратным 3, 17 и 51.

var
  N, X, i, ci, cnt, m1, m3, m17, m51 : integer;
  f : text;
begin
  Assign(f, 'C:\PABCWork.NET\test-8-41-1.txt');
  Reset(f);
  Readln(f, N); // Ввод из первой строки
  m3:= 0; // счетчик множителей кратных 2
  m17:= 0; // счетчик множителей кратных 5
  m51:= 0; // счетчик множителей кратных 10
  for i := 1 to N do begin
    Readln(f, X);
    if X mod 51 = 0 then Inc(m51)
    else if X mod 17 = 0 then Inc(m17)
         else if X mod 3 = 0 then Inc(m3);
  end;
  Close(f);
  cnt := (m51 * (m51 - 1)) div 2; // кратные 51 * кратные 51
  cnt := cnt + m51 * (N - m51); // кратные 51 * остальные числа
  cnt := cnt + m3 * m17; // кратные 3 * кратные 17
  Writeln(cnt);
end.

Вариант 2. Подсчитывание количества произведений происходит на каждом шаге цикла по текущему числу и подсчитанным числам, кратным 3, 17 и 51.

var
  N, X, i, ci, cnt, m1, m3, m17, m51 : integer;
  f : text;
begin
  Assign(f, 'C:\PABCWork.NET\test-8-41-2.txt');
  Reset(f);
  Readln(f, N); // Ввод из первой строки
  m1:= 0; // счетчик чисел
  m3:= 0; // счетчик множителей кратных 2
  m17:= 0; // счетчик множителей кратных 5
  m51:= 0; // счетчик множителей кратных 10
  cnt := 0; // Счетчик произведений кратных 10
  Readln(f, X); //Ввод первого элемента
  // Подсчет произведений
  for i := 2 to N do begin
    if X mod 51 = 0 then Inc(m51);
    if X mod 17 = 0 then Inc(m17);
    if X mod 3 = 0 then Inc(m3);
    Inc(m1);
    Readln(f, X);
    if X mod 51 = 0 then cnt := cnt + m1
    else if X mod 17 = 0 then cnt := cnt + m3
         else if X mod 3 = 0 then cnt := cnt + m17
              else cnt := cnt + m51;
  end;
  Close(f);
  Writeln(cnt);
end.