Cod sursa(job #213453)

Utilizator P1gl3TGilca Mircea Alexandru P1gl3T Data 9 octombrie 2008 20:59:01
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <stdio.h>
#include <vector>
#define N 1000100

using namespace std;

const int n_max = 2000020;  
vector <bool> m(n_max,false);

int n, nr[N], v, maxim;
long long sol;

inline long long combinari(long long x) { return x*(x-1)/2; }

void read()
{
	freopen("pairs.in","r",stdin);
	freopen("pairs.out","w",stdout);
	scanf("%d", &n);
	int t;
	for (int i = 1; i <= n; ++ i)
	{
		scanf("%d", &t);
		m[t] =1;
		if(maxim<t) maxim=t;
	}
	sol=combinari(n);
}

void solve()
{	
	long long i,j;
	for ( i = 2; i <= maxim; ++i)
	{
		v=0;
		if (nr[i] == -1)
			continue;
		
		if (nr[i] == 0)
			for (j = i; j <= maxim; j+=i)
				if(nr[j] != -1)
					++nr[j];
				
		for (j = i; j <= maxim; j+=i)
			if(m[j])
				++v;
		
		long long k = i*i;
		
		if (2*k <= 1000000)  
            for (j = k; j <= maxim; j+=k)  
                 nr[j] = -1;  
         else   
            if(k<=1000000)  
                nr[k] = -1;  
		
		if (nr[i]%2 == 0)
			sol+=combinari(v);
		else
			sol-=combinari(v);
	}
}
void print(){ printf("%lld\n", sol); }
	
int main()
{
	
	read();
	solve();
	print();
	return 0;
}