Mai intai trebuie sa te autentifici.
Cod sursa(job #158599)
Utilizator | Data | 13 martie 2008 18:31:42 | |
---|---|---|---|
Problema | Pairs | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.09 kb |
#include<stdio.h>
long x[1000002],p[200],a[1000002],v[1000002],n,max;
long long rez;
int main()
{ long aux,i,j,ok,mult,m,k;
//citire date
FILE *f=fopen("pairs.in","r");
fscanf(f,"%ld",&n);
max=0;
for (i=1;i<=n;i++)
{ fscanf(f,"%ld",&aux);
if (aux>max) max=aux;
a[aux]=1;
}
fclose(f);
//construiesc vector x
for (i=2;i<=max;i++)
for (j=1;i*j<=max;j++)
if (a[i*j]) x[i]++;
//ciur
v[0]=v[1]=1;p[1]=2;m=1;
for (i=4;i<=max;i+=2) v[i]=1;
for (i=3;i<=max;i+=2)
if (!v[i])
{ p[++m]=i;
for (j=3;j*i<=max;j+=2)
v[i*j]=1;
}
//determin rez
for (i=2,rez=0;i<=max;i++)
{ aux=i;
j=1;ok=1;
k=0;
if (!v[i]) aux=k=1;
else
while (j<=m&&p[j]<=aux&&ok)
{ mult=0;
while (aux%p[j]==0)
{ mult++;
aux/=p[j]; }
if (mult>1) ok=0;
else { j++;
if (mult>0) k++; }
}
if (ok&&aux<=1)
if (k%2) rez+=(long long)x[i]*(x[i]-1)/2;
else rez-=(long long)x[i]*(x[i]-1)/2;
}
//afisare
FILE *g=fopen("pairs.out","w");
fprintf(g,"%lld",(long long)n*(n-1)/2-rez);
fclose(g);
return 0;
}