Cod sursa(job #3261492)

Utilizator adelinapetreAdelina Petre adelinapetre Data 6 decembrie 2024 13:35:29
Problema Pairs Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;

const int Nmax = 1e5 + 5, Vmax = 1e6 + 5;

ifstream cin("pairs.in");
ofstream cout("pairs.out");

int v[Nmax], f[Vmax], m[Vmax], c[Vmax];
vector<int> divi;

void precalc()
{
    for(int i = 1; i < Vmax; i ++)
        for(int j = i; j < Vmax; j += i)
            m[i] += f[j];
}

void getdivi(int a)
{
    divi.clear();
    for(int i = 1; i * i <= a; i ++)
    {
        if(a % i == 0)
        {
            divi.push_back(i);
            if(i != a / i)
                divi.push_back(a / i);
        }
    }
    sort(divi.begin(), divi.end());
}

int main()
{
    long long n, i, ans = 0, j, k;
    cin >> n;
    for(i = 1; i <= n; i ++)
    {
        cin >> v[i];
        f[v[i]] ++;
    }
    precalc();
    for(i = 1; i <= n; i ++)
    {
        getdivi(v[i]);
        for(j = 0; j < divi.size(); j ++)
            c[divi[j]] = m[divi[j]];
        for(j = divi.size() - 1; j >= 0; j --)
            for(k = j + 1; k < divi.size(); k ++)
                if(divi[k] % divi[j] == 0)
                    c[divi[j]] -= c[divi[k]];
        ans += c[1];
    }
    cout << ans / 2;
    return 0;
}