Cod sursa(job #238254)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 1 ianuarie 2009 14:32:16
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#define T 32000 
int comb2(int n)
{
	return n*(n-1)/2;
}
int pr[32000],k=0;   
void ciur()   
{   
    int i,j;   
    bool c[T]={false};   
    for (i=2; i*i<T; i++)   
    {   
        if (!c[i])   
            for (j=i*i; j<T; j+=i)   
                c[j]=true;   
    }   
    for (i=2; i<T; ++i)   
        if (!c[i])   
            pr[++k]=i;   
}   
bool prim(int n)   
{   
    int i;   
    if (n<2)   
        return false;   
    for (i=1; pr[i]*pr[i]<=n; i++)   
        if (n%pr[i]==0)   
            return false;   
    return true;   
}   
bool verificare(int n)
{
	int i,nrdiv=0;
	for (i=1; pr[i]<=n/2; i++)
		if (n%pr[i]==0)
		{
			nrdiv++;
		}
	if (nrdiv>=2)
		return true;
	return false;
}
int main()
{
	freopen("pairs.in","r",stdin);
	freopen("pairs.out","w",stdout);
	int n,i,cont,a[100005],j,nrdiv,perechi,max=0;
	ciur();
	scanf("%d",&n);
	for (i=1; i<=n; i++)
		scanf("%d",&a[i]);
	perechi=comb2(n);
	for (i=1; i<=n; i++)
		if (a[i]>max)
			max=a[i];
	for (i=2; i<=max/2; i++)
	{
		nrdiv=0;
		for (j=1; j<=n; j++)
			if (a[j]%i==0)
				nrdiv++;
	if (nrdiv)
		if (prim(i))
		{
			perechi-=comb2(nrdiv);
		}
		else
			if (verificare(i))
			{
				perechi+=comb2(nrdiv);
			}
	}
	printf("%d",perechi);
	return 0;
}