3
vector<bool> sieve(int n) {4
vector<bool> prime(n + 1);5
for (int i = 0; i <= n; i++) prime[i] = 1;6
for (int p = 2; p * p <= n; p++) {8
for (int i = p * p; i <= n; i += p) prime[i] = 0;11
prime[1] = prime[0] = 0;14
vector<int> factors(int n, vector<int> &primelist) {16
for (int i = 0; primelist[i] * primelist[i] <= n && i < primelist.size(); i++) {17
if (n % primelist[i] == 0) {18
facs.push_back(primelist[i]);19
while (n % primelist[i] == 0) {24
if (n > 1) facs.push_back(n);27
void dfs(vector<vector<int>> &gr, int node, vector<int> &vis, int &compSize) {28
if (vis[node]) return;31
for (auto x : gr[node]) {32
dfs(gr, x, vis, compSize);37
int largestComponentSize(vector<int> &nums) {39
vector<vector<int>> gr(n);40
vector<bool> prime = sieve(1e5 + 6);41
vector<int> primelist;42
// Getting all the primes till 10^5 as maximum value of nums[i] is 10^543
for (int i = 2; i <= 1e5 + 5; i++)44
if (prime[i]) primelist.push_back(i);45
unordered_map<int, int> m; // to store the index of the node with prime factor x46
for (int i = 0; i < n; i++) {47
vector<int> facs = factors(nums[i], primelist);49
if (m.find(j) == m.end()) { // prime factor had not occured before50
m[j] = i; // j is the prime factor and its index is i52
// prime factor has already been seen before in a previous number and53
// nums[i] is connected to that number54
gr[i].push_back(m[j]);55
gr[m[j]].push_back(i);61
for (int i = 0; i < n; i++) { // running a simple dfs to calculate the maximum component size64
dfs(gr, i, vis, compSize);65
ans = max(ans, compSize);