Имеется набор данных, состоящий из положительных целых чисел. Необходимо определить количество пар элементов (aᵢ, aⱼ) этого набора, в которых 1 ≤ i+5 ≤ j ≤ N и сумма элементов кратна 14.
Входные данные. Даны два входных файла (файл A и файл B), каждый из которых содержит в первой строке количество чисел N (1 ≤ N ≤ 100 000). Каждая из следующих N строк содержит одно натуральное число, не превышающее 10 000.
Пример входного файла:
8
7
5
6
12
24
7
9
12
Для указанных входных данных количество подходящих пар должно быть равно 2. В приведённом наборе имеются две пары (7, 7) и (5, 9), сумма элементов которых кратна 14 и индексы в последовательности отличаются не менее, чем на 5.
В ответе укажите два числа: сначала количество подходящих пар для файла А, затем для файла B.
const fs = require('fs');
/** Список строк из файла */
const lineList = fs.readFileSync('./data.txt').toString().split('\n');
/** Список чисел */
const numberList = [];
for (let lineIndex = 1; lineIndex < lineList.length; lineIndex++) {
const parsedInteger = parseInt(lineList[lineIndex]);
if (parsedInteger >= 0) {
numberList.push(parsedInteger);
}
}
/** Максимально допустимое число из списка */
const maxNumber = 10000;
/**
* Делитель
*
* Число на которое сумма пары чисел будет делиться без остатка.
*
* @see https://w.wiki/3FLg
*/
const divisor = 14;
/** Отставание для подсчёта чисел */
const numberCountersLag = 5;
/**
* Хеш-таблица для подсчёта чисел
*
* @see https://w.wiki/3FLr
*
* @type {{ [number: number]: number }}
*/
const numberCounters = {};
/** Счётчик пар */
let pairsCounter = 0;
for (
/** Индекс текущего числа */
let currentIndex = numberCountersLag;
currentIndex < numberList.length;
currentIndex++
) {
/** Запаздывающий индекс */
const laggedIndex = currentIndex - numberCountersLag;
if (laggedIndex >= 0) {
/** Запаздывающее число, которое пора засчитать */
const laggedNumber = numberList[laggedIndex];
if (numberCounters[laggedNumber]) {
numberCounters[laggedNumber]++;
} else {
numberCounters[laggedNumber] = 1;
}
}
/** Текущее число, которому нужно найти пару */
const currentNumber = numberList[currentIndex];
for (
/** Сумма пары чисел */
let pairSum = divisor;
pairSum <= maxNumber + maxNumber;
pairSum = pairSum + divisor
) {
/**
* Дельта
*
* Необходимое число для составления пары.
*/
const delta = pairSum - currentNumber;
/**
* Количество дельт
*/
const deltaQuantity = numberCounters[delta];
if (delta > 0 && deltaQuantity) {
for (let counter = 0; counter < deltaQuantity; counter++) {
pairsCounter++;
}
}
}
}
console.log('Количество пар', pairsCounter.toLocaleString('ru'));
8 и 128 567 918.