Cod sursa(job #2732653)

Utilizator AACthAirinei Andrei Cristian AACth Data 29 martie 2021 09:54:10
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.95 kb
#pragma GCC optimize ("Ofast")
#include <bits/stdc++.h>
using namespace std;
ifstream f("pairs.in");
ofstream g("pairs.out");

const int Max = 1e6 + 1;
void nos()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
}
int n;
int multime[100001];
int maxx;
void read()
{
    f>>n;
    int i;
    for(i=1; i<=n; i++)
    {
        f>>multime[i];
        maxx = max(maxx,multime[i]);
    }

}
int which;
int divisible[Max];
unsigned int dp[Max];
int ans = 1;
int last;
vector < int > divizori[Max];
void bkt(int k)
{
    if( k == last)
    {
        divisible[ans] ++;
        return;
    }
    bkt(k+1);
    int aux = ans;
    ans*=divizori[which][k];
    bkt(k+1);
    ans = aux;
}

bitset < Max > prime;
void ciur()
{
    int i,j;
    for(i=2;i<=maxx / 2;i++)
    {
        if(prime[i] == 0)
        {
            //i e prim
            int last = maxx / i;
            for(j=2;j<=last;j++)
            {
                prime[i*j] = 1;
                divizori[i*j].push_back(i);
            }
        }
    }
    for(i=1;i<=maxx;i++)
        if(prime[i] == 0)
        divizori[i].push_back(i);
}
void baga(int n)
{
   // divi = divizori[n];
    last = divizori[n].size();
    which = n;
    ans = 1;
    bkt(0);
}
void solve()
{

    //dp[i] nr de perechi care au cmmdc i
    //un fel de ciur invers?
    int i,j;
    ciur();
    for(i=1;i<=n;i++)
        baga(multime[i]);
    int start = maxx / 2;
    for(i = start; i>= 1; i--)
    {
        unsigned int val = divisible[i];
        dp[i] = (val*(val-1)) / 2;
        int last = maxx / i;
        for(j=2; j<=last; j++)
            dp[i] -= dp[i*j];
        //scadem multipli, principiul includerii excluderii
    }
    g<<dp[1];
}
void restart()
{

}

int32_t main()
{
  //  cout<<(sizeof(divizori) + sizeof(dp) + sizeof(divisible) + sizeof(prime))/ 1024.0 / 1024.0;
    read();
    solve();
    restart();
    return 0;
}