Cod sursa(job #918396)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 18 martie 2013 20:38:47
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
#define VM 1000010

using namespace std;

ifstream f("pairs.in");
ofstream g("pairs.out");

int N, M;
int i, j;
int X;
int D[8][VM];
int Frec[VM];
int ANS;
bool V[VM];

int Count (int X)
{
    int i, N=1 << D[0][X], j;
    int x;
    int ANS=0;
    int K;

    for (i=1; i<N; i++)
    {
        x=1;
        K=0;
        for (j=0; (1 << j)<N; j++)
            if ((i&(1 << j)))
                x*=D[j+1][X], K++;

        if (K%2)
            ANS+=Frec[x];
        else
            ANS-=Frec[x];
    }

    return ANS;
}

void Update (int X)
{
    int i, N=1 << D[0][X], j;
    int x;

    for (i=1; i<N; i++)
    {
        x=1;
        for (j=0; (1 << j)<N; j++)
            if ((i&(1 << j)))
                x*=D[j+1][X];

        Frec[x]++;
    }
}

void CreateD ()
{
    int i, j;

    for (i=2; i<VM; i++)
        if (!V[i])
            for (j=i; j<VM; j+=i)
            {
                D[0][j]++;
                D[D[0][j]][j]=i;
                V[j]=1;
            }
}

int main ()
{
    CreateD();
    f >> N;
    for (i=1; i<=N; i++)
    {
        f >> X;
        ANS+=i-1-Count(X);
        Update(X);
    }

    g << ANS << '\n';

    f.close();
    g.close();

    return 0;
}