Cod sursa(job #1962381)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 11 aprilie 2017 18:42:48
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <vector>
#define VAL 1005
#define DIM 1000005

using namespace std;

ifstream fin("pairs.in");
ofstream fout("pairs.out");

int N, i, j, nr, P;
int d[VAL], K, cnt;
int card[DIM], ANS;
bool ok[VAL];
bool ap[DIM];
vector<int> prim;
vector<int> :: iterator it;

void Sieve()
{
    for (i=2; i<VAL; i++)
    {
        if (ok[i]==false)
        {
            prim.push_back(i);
            for (j=i*i; j<VAL; j+=i)
              ok[j]=true;
        }
    }
}

int main()
{
    fin >> N;
    Sieve();
    for (cnt=1; cnt<=N; cnt++)
    {
        fin >> nr;
        ap[nr]=true;
        K=0;
        for (it=prim.begin(); it!=prim.end() && (*it)*(*it)<=nr; it++)
        {
            if (nr % (*it)==0)
            {
                d[K++]=*it;
                while (nr % (*it)==0)
                  nr/=*it;
            }
            if (nr==1)
              break;
        }
        if (nr>1)
          d[K++]=nr;
        for (i=1; i<(1 << K); i++)
        {
            nr=0;
            P=1;
            for (j=0; j<K; j++)
              if ((i & (1 << j))!=0)
                P*=d[j], nr++;
            card[P]=nr;
        }
    }
    for (i=2; i<VAL; i++)
    {
        nr=0;
        for (j=i; j<VAL; j+=i)
          if (ap[j]==true)
            nr++;
        if (nr!=0)
        {
            if (card[i] % 2==1)
              ANS+=nr*(nr-1) / 2;
            else
              ANS-=nr*(nr-1) / 2;
        }
    }
    fout << ANS << '\n';
    fin.close();
    fout.close();
    return 0;
}