Cod sursa(job #918444)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 18 martie 2013 21:22:41
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 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[10];
int Frec[VM];
int Last[VM];
long long ANS;
bool V[VM];

int Count ()
{
    int i, N=1 << M, 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], K++;

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

    return ANS;
}

void Update ()
{
    int i, N=1 << M, 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];

        Frec[x]++;
    }
}

void CreateLast ()
{
    int i, j;
    for (i=2; i<VM; i++)
        if (!V[i])
            for (j=i; j<VM; j+=i)
            {
                V[j]=1;
                Last[j]=i;
            }
}

int main ()
{
    CreateLast();
    f >> N;
    for (i=1; i<=N; i++)
    {
        f >> X;
        M=0;

        while (X>1)
        {
            if (Last[X]!=D[M])
                D[++M]=Last[X];
            X/=Last[X];
        }


        ANS+=1LL*i-1-Count();
        Update();
    }

    g << ANS << '\n';

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

    return 0;
}