Cod sursa(job #213548)

Utilizator AndreyPAndrei Poenaru AndreyP Data 10 octombrie 2008 11:58:59
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.95 kb
#include<stdio.h>
#include<vector>
using namespace std;
#define N 100005
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;
	}
	rez=(long long)((n*(n-1))>>1);
}
inline long long comb(int x)
{
	return (long long)(((x-1)*x)>>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;
}