Cod sursa(job #493696)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 19 octombrie 2010 02:46:42
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <cstdio>
#define nmax 100010
#define lmax 2000005

int n;
int v[nmax], a[nmax], f[lmax], l, t, k, b[lmax], g[lmax];
char p[lmax];
long long sol;

int main()
{
	freopen("pairs.in","r",stdin);
	freopen("pairs.out","w",stdout);
	scanf("%d",&n);
	int i, j, x;
	long long c;
	for (i=1; i<=n; i++) 
	{
		scanf("%d",&x);
		if (x>l) l=x;
		v[x]=1;
	}
	for (i=2; i<=l; i++) p[i]=1;
	for (i=2; i<=l; i++)
		if (p[i])
		{
			for (j=2*i; j<=l; j+=i)
				p[j]=0;
		}
	for (i=2; i<=l; i++)
	{
		if (p[i])
			a[++t]=i;
	}
	for (i=2; i<=l; i++) f[i]=0;
	for (i=1; i<=t; i++)
		for (j=a[i]; j<=l; j+=a[i])
			if (!((j/a[i])%a[i])) f[j]=-1; else 
				if (f[j]!=-1) f[j]++;
	for (i=2; i<=l; i++)
		if (f[i]>-1)
		{			
			b[++k]=i;
			g[k]=f[i];
		}
	for (i=1; i<=k; i++)
	{
		c=0;
		for (j=b[i]; j<=l; j+=b[i])
			if (v[j]) c++;
		if (g[i]%2) sol+=c*(c-1)/2; else
			sol-=c*(c-1)/2;
	}
	sol=(long long) n*(n-1)/2-sol;
	printf("%lld\n",sol);
}