Вы можете предвычисление списка всех делителей возможных чисел на входе = O (п^1,5)
После этого перебрать вход, при этом отслеживая, сколько стоит число (т. е. сколько пар оно образует).
Для каждого числа на входе вам нужно итератора над всеми его делителей, т.е. O (п^1,5)
Таким образом, общая сложность O (п^1,5) где п максимум 100000 и размер вашего ввода.
class Denominators {
public static void main (String[] a) {
int maxValue = 100000;
int[] problemSet = {8, 7, 6, 5, 4, 3, 2};
System.out.println (new Denominators().solve(problemSet, maxValue));
}
int solve (int[] problemSet, int maxValue) {
List<List<Integer>> divisors = divisors(maxValue);
int[] values = new int[maxValue + 1];
int result = 0;
for (int i : problemSet) {
result += values[i];
for (int d : divisors.get(i)) {
values[d]++;
}
}
return result;
}
private List<List<Integer>> divisors (int until) {
List<List<Integer>> result = new ArrayList<>();
for (int i = 0; i <= until; i++) {
result.add (new ArrayList<Integer>());
}
for (int i = 1; i * i <= until; i++) {
for (int j = i; j * i <= until ; j++) {
result.get (i * j).add(i);
if (i != j) result.get (i * j).add(j);
}
}
return result;
}
}
Есть ли какие-либо ограничения? Насколько велико каждый номер? –
каждый элемент находится между 1 и 10^5 –
нет, цифры могут быть в любом случайном порядке –