Cod sursa(job #110202)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 25 noiembrie 2007 20:28:26
Problema Pairs Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.28 kb
#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;
        
}