Pagini recente » Cod sursa (job #781817) | Cod sursa (job #2418480) | Cod sursa (job #445001) | Cod sursa (job #1712193) | Cod sursa (job #110202)
Cod sursa(job #110202)
#include <stdio.h>
#define NMAX 1000000
#define MMAX 100100
#define BMAX (1<<10)+10
int N, V[NMAX+10], P[90000], np;
int X[NMAX+10], inM[NMAX+10], npairs, MAX, T[10];
void back(int nv, long long p)
{
int i;
for (i = T[nv-1]+1; i <= np; i++)
{
T[nv] = i;
if (P[i]*p<=NMAX)
{
if (nv&1) npairs-=X[p*P[i]];
else npairs+=X[p*P[i]];
back(nv+1,p*P[i]);
}
else return;
}
}
int main()
{
int i, j, num;
for (i = 2; i <= NMAX; i++)
if (!V[i])
{
P[++np] = i;
for (j = i; j <= NMAX; j += i) V[j] = 1;
}
freopen("pairs.in", "r", stdin);
scanf("%d", &N);
for (i = 0; i < N; i++)
scanf("%d", &j), inM[ j ] = 1, MAX = (MAX>j)?MAX:j;
for (i = 2; i <= NMAX; i++)
{
for (j = i, num = 0; j <= NMAX; j+=i)
if (inM[j]) num++;
X[i] = num;
}
npairs = N*(N-1)/2;
back(1,1);
freopen("pairs.out", "w", stdout);
printf("%d\n", npairs);
return 0;
}