Mai intai trebuie sa te autentifici.
Cod sursa(job #183485)
Utilizator | Data | 22 aprilie 2008 11:38:01 | |
---|---|---|---|
Problema | Pairs | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.53 kb |
# include <stdio.h>
# define input "pairs.in"
# define output "pairs.out"
# define MAX 1000001
bool a[MAX],u[MAX];
int n,i,j,x,m,k,aux,nr;
int b[MAX],prim[MAX];
long long res,ret;
int main()
{
freopen(input, "r", stdin);
freopen(output, "w", stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
a[x] = 1;
if( x > m )
m = x;
}
long long q=n;
ret = (q*(q-1))/2;
for(i=2;i<=m;i++)
{
for(j=1;j*i<=m;j++)
b[i] += a[j*i];
}
prim[1] = 2;
nr = 1;
for(i=3;i<=m;i+=2)
if(!u[i])
{
prim[++nr] = i;
for(j=i+i;j<=m;j+=i)
u[j] = true;
}
for(k=2;k<=m;k++)
{
if(b[k] >= 2)
{
aux = k;
n = 1;
bool ok = true;
for(j=1;prim[j]*prim[i] <= aux;j++)
{
if(aux%prim[j] == 0)
{
n++;
aux/=prim[j];
}
if(aux%prim[j] == 0)
{
ok = false;
break;
}
}
if(ok)
{
long long q = b[k];
if(n%2)
res += (q*(q-1))/2;
else
res -= (q*(q-1))/2;
}
}
}
printf("%lld",ret-res);
return 0;
}