#include <bits/stdc++.h>
using
namespace
std;
int
findSet(
int
element, vector<
int
>& parentNodes)
{
if
(element == parentNodes[element]) {
return
element;
}
parentNodes[element]
= findSet(parentNodes[element], parentNodes);
return
parentNodes[element];
}
void
establishSet(
int
element, vector<
int
>& parentNodes,
vector<
int
>& componentSizes)
{
parentNodes[element] = element;
componentSizes[element] = 1;
}
void
unifySets(
int
a,
int
b, vector<
int
>& parentNodes,
vector<
int
>& componentSizes)
{
a = findSet(a, parentNodes);
b = findSet(b, parentNodes);
if
(a != b) {
if
(componentSizes[a] < componentSizes[b]) {
swap(a, b);
}
parentNodes[b] = a;
componentSizes[a] += componentSizes[b];
}
}
vector<
int
> extractPrimeFactors(
int
value)
{
vector<
int
> primeFactors;
for
(
int
i = 2; i * i <= value; i++) {
if
(value % i == 0) {
while
(value % i == 0) {
value /= i;
}
primeFactors.push_back(i);
}
}
if
(value > 1) {
primeFactors.push_back(value);
}
return
primeFactors;
}
int
largestConnectedComponentSize(vector<
int
>& array,
int
n)
{
vector<
int
> parentNodes(n), componentSizes(n);
for
(
int
i = 0; i < n; i++) {
establishSet(i, parentNodes, componentSizes);
}
vector<
int
> primeFactorsArray[n];
for
(
int
i = 0; i < n; i++) {
primeFactorsArray[i]
= extractPrimeFactors(array[i]);
}
int
maximumElement = 0;
for
(
int
i = 0; i < n; i++) {
maximumElement = max(maximumElement, array[i]);
}
vector<
int
> isPresent(maximumElement + 1, -1);
for
(
int
i = 0; i < n; i++) {
for
(
int
j = 0; j < primeFactorsArray[i].size();
j++) {
int
x = primeFactorsArray[i][j];
if
(isPresent[x] != -1) {
unifySets(isPresent[x], i, parentNodes,
componentSizes);
}
isPresent[x] = i;
}
}
int
largestComponentSize = 0;
for
(
int
i = 0; i < n; i++) {
largestComponentSize
= max(largestComponentSize, componentSizes[i]);
}
return
largestComponentSize;
}
int
main()
{
int
N = 6;
vector<
int
> arr = { 10, 4, 2, 5, 3, 9 };
int
largestComponentSize
= largestConnectedComponentSize(arr, N);
cout << largestComponentSize << endl;
return
0;
}