Array Reodering (Codeforces 1535B)
Tags: Math, number theory

You are given an array $$$a$$$ consisting of $$$n$$$ integers.Let's call a pair of indices $$$i$$$, $$$j$$$ good if $$$1 \le i < j \le n$$$ and $$$\gcd(a_i, 2a_j) > 1$$$ (where $$$\gcd(x, y)$$$ is the greatest common divisor of $$$x$$$ and $$$y$$$).Find the maximum number of good index pairs if you can reorder the array $$$a$$$ in an arbitrary way.

Input: The first line contains a single integer $$$t$$$ ($$$1 \le t \le 1000$$$) — the number of test cases.The first line of the test case contains a single integer $$$n$$$ ($$$2 \le n \le 2000$$$) — the number of elements in the array.The second line of the test case contains $$$n$$$ integers $$$a_1, a_2, \dots, a_n$$$ ($$$1 \le a_i \le 10^5$$$).It is guaranteed that the sum of $$$n$$$ over all test cases does not exceed $$$2000$$$.

Output: For each test case, output a single integer — the maximum number of good index pairs if you can reorder the array $$$a$$$ in an arbitrary way.

Note: In the first example, the array elements can be rearranged as follows: $$$[6, 3, 5, 3]$$$.In the third example, the array elements can be rearranged as follows: $$$[4, 4, 2, 1, 1]$$$.

Sample Inputs:
3
4
3 6 5 3
2
1 7
5
1 4 2 4 1

Sample Outputs:
4
0
9

Solution (Python):
import math
for s in [*open(0)][2::2]:
    a = sorted(map(int, s.split()), key=lambda x: x % 2)
    print(sum((math.gcd(2 * x, y) > 1 for (i, x) in enumerate(a) for y in a[:i])))

Solution (Python):
from math import gcd

def solve(n, a):
    ans = 0
    odd = [x for x in a if x % 2 == 1]
    ans += n * (n - 1) // 2 - len(odd) * (len(odd) - 1) // 2
    odd1 = [x for x in odd if x != 1]
    for i in range(len(odd1)):
        for j in range(i + 1, len(odd1)):
            if gcd(odd1[i], odd1[j]) > 1:
                ans += 1
    return ans

def print_solution(solution):
    print(solution)

def main():
    t = int(input().strip())
    for _ in range(t):
        n = int(input().strip())
        a = list(map(int, input().strip().split()))
        solution = solve(n, a)
        print_solution(solution)
if __name__ == '__main__':
    main()

Solution (Python):
from math import gcd

def solve(n, a):
    ans = 0
    odd = [x for x in a if x % 2 == 1]
    ans += n * (n - 1) // 2 - len(odd) * (len(odd) - 1) // 2
    for i in range(len(odd)):
        for j in range(i + 1, len(odd)):
            if gcd(odd[i], odd[j]) > 1:
                ans += 1
    return ans

def print_solution(solution):
    print(solution)

def main():
    t = int(input().strip())
    for _ in range(t):
        n = int(input().strip())
        a = list(map(int, input().strip().split()))
        solution = solve(n, a)
        print_solution(solution)
if __name__ == '__main__':
    main()