NT06 - Editorial

Difficulty

Medium

Problem

Problem link

Solution

Lets define an array div where div_i is equal to the number of pairs of elements in the array having gcd divisible by i. To find div_i we firstly find the number of elements in the array that are divisible by i, let’s say cnt_i, then it is obvious that div_i = cnt_i \cdot (cnt_i -1 )/2.
Now we define another array dp where dp_i is equal to the number of pairs of elements in the array having gcd equal to i. How to find the value of dp_i? We can say that the number of pairs having gcd equal to i will be equal to the number of pairs having gcd divisible by i minus pairs having gcd equal to some multiple of i (like 2\cdot i, 3\cdot i …). So on this basis we get the following relation
dp_i = div_i - \sum_{j=2}^{i\cdot j \leq 2\cdot 10^6}dp_{i\cdot j}
Our answer will be the smallest i having dp_i = 0.

Time complexity

O(NlogN) where N is the upper limit of the elements in the array.

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	int n;
	cin>>n;
	const int N=2e6;
	vector<ll>cnt(N+1);
	vector<ll>div(N+1);
	for(int i=0; i<n; i++){
		int num;
		cin>>num;
		cnt[num]++;
	}
	for(int i=1; i<=N; i++){
		for(int j=2; i*j<=N; j++)
		 cnt[i]+=cnt[i*j];
	}
	for(int i=1; i<=N; i++){
		div[i]=cnt[i]*(cnt[i]-1)/2;
	}
	vector<ll>dp(N+1);
	for(int i=N; i>=1; i--){
		dp[i]=div[i];
		for(int j=2; i*j<=N; j++)
		 dp[i]-=dp[i*j];
	}
	for(int i=1; i<=N; i++){
		if(dp[i]==0){
			cout<<i;
			return 0;
		}
	}
	cout<<N+1;
	return 0;
}