Pagini recente » Rezultatele filtrării | Cod sursa (job #46821) | Rezultatele filtrării | Cod sursa (job #2467195) | Cod sursa (job #110196)
Cod sursa(job #110196)
#include <stdio.h>
#define NMAX 1000000
#define MMAX 100100
#define BMAX (1<<10)+10
int N, V[NMAX+10], P[90000], M[MMAX], np, VMAX = 1000000;
int X[NMAX], inM[MMAX], 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<=MAX)
{
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", M+i), inM[ M[i] ] = 1, MAX = (MAX>M[i])?MAX:M[i];
for (i = 1; i <= MAX; i++)
{
for (j = i, num = 0; j <= MAX; 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;
}