Cod sursa(job #2915067)

Utilizator euyoTukanul euyo Data 21 iulie 2022 19:17:12
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <fstream>

using namespace std;

using ll = long long;

ifstream fin( "pairs.in" );
ofstream fout( "pairs.out" );

const int MAXV = 1e6;

bool ciur[1 + MAXV], f[1 + MAXV], in[1 + MAXV];
int cnt[1 + MAXV];

int getNum() {
  int n = 0;
  char ch;
  while ( isspace( ch = fin.get() ) );
  do {
    n = n * 10 + ch - '0';
  } while ( isdigit( ch = fin.get() ) );
  return n;
}

int main() {
  int n, x, mx = 0;

  n = getNum();
  for ( int i = 1; i <= n; ++i ) {
	x = getNum();
	mx = max(mx, x);
	in[x] = true;
  }
 for ( int d = 2; d <= mx; ++d ) {
	if ( ciur[d] == 0 ) {
      cnt[d] = 1;
	  for ( int i = d + d; i <= mx; i += d ) {
        ciur[i] = 1;
	    ++cnt[i];
	    if ( i % (d * d) == 0 ) { 
		  f[i] = true;
	    }
	  }
	}
  }
  ll res = 0;
  for ( int d = 2; d <= mx; ++d ) {
	if ( !f[d] ) {
	  int k = 0;
	  for ( int i = d; i <= mx; i += d ) {
		k += in[i];
	  }
	  if ( cnt[d] % 2 ) {
		res += (ll)k * (k - 1) / 2;
	  } else {
		res -= (ll)k * (k - 1) / 2;
	  }
	}
  } 
  fout << (ll)n * (n - 1) / 2 - res;
  fin.close();
  fout.close();
  return 0;
}