Cod sursa(job #129953)

Utilizator razvi9Jurca Razvan razvi9 Data 30 ianuarie 2008 18:44:32
Problema Pairs Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include<cstdio>
#include<cmath>
long long sol,rez;
int prim[80000],x[1000001];
char a[1000001],e[1000001];
int n,X,i,j,k,nr,m;
const int max=1000000;

void calc(){
	for(i=2;i<=max;++i){
		k=max/i;
		for(j=1;j<=k;++j)
			if(a[i*j]) ++x[i];}}

void prime(){
	k=sqrt(max);
	for(i=2;i<=k;++i){
		j=i*i;
		while(j<=max)
		{e[j]=1;j=j+i;}}
	for(i=2;i<=max;++i)
		if(!e[i])prim[++m]=i;}

void solve(){
	sol=(long long)n*(n-1)/2;
	rez=0;
	for(i=2;i<=max;++i){
		if(x[i]<=1) continue;
		X=i;j=1;nr=0;
		for(;prim[j]<=X;++j)
			if(X%prim[j]==0){
				nr++;
				X=X/prim[j];
				if(X%prim[j]==0) {nr=0;break;}}
		if(!nr) continue;
		if(nr%2) rez+=(long long)x[i]*(x[i]-1)/2;
		else rez-=(long long)x[i]*(x[i]-1)/2;}
	sol=sol-rez;}

int main()
{freopen("pairs.in","r",stdin);
 freopen("pairs.out","w",stdout);
 scanf("%d",&n);
 for(i=1;i<=n;++i){scanf("%d",&X);a[X]=1;}
 calc();
 prime();
 solve();
 printf("%lld\n",sol);
 fclose(stdout);
 return 0;}