Cod sursa(job #919092)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 19 martie 2013 12:59:46
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
 
#define NMAX 1000100
#define pb push_back
typedef long long lol;
 
ifstream fin("pairs.in");
ofstream fout("pairs.out");
int n, rd;
int sum[NMAX];
int pn[NMAX];
bool prime[NMAX];
vector<int> div;
 
inline void makePrime()
{
    for (int i = 2; i < NMAX; i++)
    {
        if (prime[i] == false)
        {
            for (int j = min(1LL * NMAX, 1LL * i * i); j < NMAX; j += i)
                prime[j] = true;
            pn[++pn[0]] = i;
        }
    }
}
 
inline void makeDiv(int number)
{
    div.clear();
    int d = number;
    for (int i = 1; pn[i] * pn[i] <= number && d > 1; i++)
    {
        if (d % pn[i] == 0)
        {
            div.pb(pn[i]);
            while (d % pn[i] == 0)
                d /= pn[i];
        }
    }
    if (d > 1) div.pb(d);
}
 
int main()
{
    fin >> n; makePrime();
    for (int i = 1; i <= n; i++)
    {
        fin >> rd;
        makeDiv(rd);
        int size = div.size();
         
        for (int i = 1; i < (1 << size); i++)
        {
            int num = 1, sign = -1;
            for (int j = 0; j < size; j++)
                if (i & (1 << j))
                    num = num * div[j], sign = -sign;
            sum[num] += sign;
        }
    }
     
    lol sol = 1LL * n * (n - 1) / 2;
    for (int i = 2; i < NMAX; i++)
        if (sum[i] < 0)
            sol = sol + (1LL * sum[i] * (sum[i] + 1) / 2);
        else
            sol = sol - (1LL * sum[i] * (sum[i] - 1) / 2);
    fout << sol << '\n';
    fout.close();
    return 0;  
}