Cod sursa(job #109298)

Utilizator stef2nStefan Istrate stef2n Data 25 noiembrie 2007 10:03:13
Problema Pairs Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda 1, Clasa a 10-a Marime 1.59 kb
//#define DEBUG

#include <cstdio>
#ifdef DEBUG
#include <iostream>
#endif
#include <vector>
using namespace std;

#define NMAX 100005
#define MAXRANGE 1000000
#define pb push_back

int N, x[NMAX];
vector <int> v[NMAX];
int cnt[MAXRANGE];
long long sol=0;

void desc(int x, vector <int> &v)
{
    int i=2;
    while(x>1 && i*i<=x)
    {
        if(x%i==0)
        {
            while(x%i==0)
                x/=i;
            v.pb(i);
        }
        ++i;
    }
    if(x>1)
        v.pb(x);
}

void back0(int k, int p, const vector <int> &v)
{
    if(k==(int)v.size())
    {
        cnt[p]++;
        return;
    }
    back0(k+1,p,v);
    back0(k+1,p*v[k],v);
}

void read_data()
{
    scanf("%d",&N);
    for(int i=0; i<N; ++i)
    {
        scanf("%d",&x[i]);
        desc(x[i],v[i]);
        back0(0,1,v[i]);
    }
}

void back(int k, int p, int nr, const vector <int> &v)
{
    if(k==(int)v.size())
    {
        if(nr)
            if(nr&1)
                sol-=cnt[p]-1;
            else
                sol+=cnt[p]-1;
        return;
    }
    back(k+1,p,nr,v);
    back(k+1,p*v[k],nr+1,v);
}


int main()
{
    freopen("pairs.in","r",stdin);
    freopen("pairs.out","w",stdout);
    read_data();
#ifdef DEBUG
    for(int i=0; i<N; ++i)
    {
        cerr<<x[i]<<": ";
        for(unsigned j=0; j<v[i].size(); ++j)
            cerr<<v[i][j]<<" ";
        cerr<<endl;
    }
    cerr<<endl;
    for(int i=0; i<MAXRANGE; ++i)
        if(cnt[i])
            cerr<<i<<"->"<<cnt[i]<<endl;
#endif
    for(int i=0; i<N; ++i)
    {
        sol+=N-1;
        back(0,1,0,v[i]);
    }
    printf("%Ld\n",sol/2);
    return 0;
}