Cod sursa(job #213556)

Utilizator AndreyPAndrei Poenaru AndreyP Data 10 octombrie 2008 12:05:41
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<stdio.h>
#include<vector>
using namespace std;
#define N 1000005
int n;
long long rez;
//bool mult[N];
vector<bool> mult(N);
int nrd[N];
void citire()
{
	int x;
	scanf("%d",&n);
	for(int i=1; i<=n; i++)
	{
		scanf("%d",&x);
		mult[x]=1;
	}
	long long nn=(long long)n;
	rez=(nn*(nn-1))>>1;
}
inline long long comb(int x)
{
	long long xx=(long long)x;
	return (xx*(xx-1))>>1;
}
void numara()
{
	int i,a,j1;
	long long i2,j;
	for(i=2; i<N; i++)
	{
		if(nrd[i]!=-1)
		{
			if(nrd[i]==0)
			{
				i2=(long long)i*(long long)i;
				for(j=i2; j<N; j+=i2)
					nrd[j]=-1;
				
				for(j=i; j<N; j+=i)
					if(nrd[j]!=-1)
						nrd[j]++;
			}
			a=0;
			for(j1=i; j1<N; j1+=i)
				if(mult[j1])
					a++;
			if(a>1)
			{
				if(nrd[i]&1)
					rez-=comb(a);
				else
					rez+=comb(a);
			}
			
		}
	}
}
int main()
{
	freopen("pairs.in","r",stdin);
	freopen("pairs.out","w",stdout);
	citire();
	numara();
	printf("%lld\n",rez);
	return 0;
}