Cod sursa(job #150995)

Utilizator vlad_popaVlad Popa vlad_popa Data 7 martie 2008 18:27:26
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.54 kb
using namespace std;

#include <cstdio>

int V[1<<17];
int N;
int Ct[1000001];
int NP[8];
int Nr, Np;
int P[80000];
char E[1000001];

void read ()
{
    scanf ("%d\n", &N);
    
    int i, j, tmp, pow, k;
    
    for (i = 2; i <= 1000; ++ i)
        if (E[i] != 1)
        {
            P[++ Np] = i;
            for (j = i + i; j <= 1000000; j += i)
                E[j] = 1;
        }
    for (i = 1001; i <= 1000000; ++ i)
        if (E[i] != 1)
            P[++ Np] = i;
    //printf ("%d\n", Np);
    
    for (i = 1; i <= N; ++ i)   
    {
        scanf ("%d\n", V + i);
        tmp = V[i];
        Nr = 0;
        
        for (j = 1; E[tmp] != 0; ++ j)
            if (!(tmp % P[j]))
            {
                NP[++ Nr] = P[j];
                while (!(tmp % P[j]))
                    tmp /= P[j];
            }
        if (tmp != 1)
            NP[++ Nr] = tmp;
            
        /*for (j = 1; j <= Nr; ++ j)
            printf ("%d ", NP[j]);
        printf ("\n");*/
            
        pow = (1 << Nr);
        for (j = 1; j < pow; ++ j)
        {
            tmp = 1;        
            for (k = 0; k < Nr; ++ k)
                if (j & (1 << k))
                    tmp *= (NP[k + 1]);
            ++ Ct[tmp];
        }
    }
    
    /*for (i = 1; i <= 20; ++ i)
        printf ("%d ", Ct[i]);*/
}

void solve ()
{
    int i, tmp, j, k, pow, cnt, sol;
    long long Ans = 0;
    
    for (i = 1; i <= N; ++ i)
    {
        sol = Nr = 0;
        tmp = V[i];
        
        for (j = 1; E[tmp] != 0; ++ j)
            if (!(tmp % P[j]))
            {
                NP[++ Nr] = P[j];
                while (!(tmp % P[j]))
                    tmp /= P[j];
            }
        if (tmp != 1)
            NP[++ Nr] = tmp;       
        pow = (1 << Nr);
            
        for (j = 1; j < pow; ++ j)
        {
            tmp = 1;
            cnt = 0;
            for (k = 0; k < Nr; ++ k)
                if (j & (1 << k))
                {
                    tmp *= (NP[k + 1]);
                    ++ cnt;
                }
            if (cnt & 1)
                sol += Ct[tmp];
            else
                sol -= Ct[tmp];
        }
        
        //printf ("%d\n", sol);
        Ans = (long long)(Ans + N - sol);
    }
    
    Ans = (long long) (Ans / 2);
    printf ("%lld\n", Ans);
}

int 
 main ()
{
    freopen ("pairs.in", "rt", stdin);
    freopen ("pairs.out", "wt", stdout);
    
    read ();
    solve ();
    
    return 0;
}