Cod sursa(job #365636)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 19 noiembrie 2009 14:59:43
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.76 kb
#include<stdio.h>
long long n,max;
long long v[100002];
long long f[1<<20],nr[1<<20],d[1<<20];

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

void rez()
{
	long long i,j,k,sol=0;
	for(i=2;i<=max;i++)
		if(!d[i])
		{
			for(k=i*i;k<=max;k+=i*i)
				d[k]=-1;
			for(j=i;j<=max;j+=i)
				d[j]=d[j]+(d[j]>=0);
		}
	for(i=2;i<=max;i++)
		if(d[i]>=0)
			sol=sol+(d[i]&1)?calc(nr[i]):(-1*calc(nr[i]));
	printf("%lld\n",(calc(n)-sol)/2);
}

int main()
{
	freopen("pairs.in","r",stdin);
	freopen("pairs.out","w",stdout);
	scanf("%d",&n);
	long long i,j;
	for(i=1;i<=n;i++)
	{
		scanf("%lld",&v[i]);
		f[v[i]]++;
		if(v[i]>max)
			max=v[i];
	}
	for(i=2;i<=max;i++)
		for(j=i;j<=max;j+=i)
			nr[i]+=f[j];
	rez();
	return 0;
}