Cod sursa(job #2564198)

Utilizator adiaioanaAdia R. adiaioana Data 1 martie 2020 19:01:04
Problema Pairs Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <fstream>
#include <vector>
#define NMAX 1000000
using namespace std;
ifstream cin("pairs.in");
ofstream cout("pairs.out");
vector < vector <int> > v(100001);
int ind[NMAX+1], N, val;
long long nr[NMAX+1];
short semn[NMAX+1];
bool ciur[NMAX+1];
inline void kindaciur()
{
    if(ind[2])
        v[ind[2]].push_back(2);
    for(int d=4; d<=NMAX; ciur[d]=1,d+=2)
        if(ind[d])
            v[ind[d]].push_back(2);
    for(int d=3; d*2<=NMAX; d+=2)
        if(!ciur[d])
        {
            if(ind[d])
                v[ind[d]].push_back(d);
            for(int j=d*2; j<=NMAX; ciur[j]=1,j+=d)
                if(ind[j])
                    v[ind[j]].push_back(d);
        }

}
int main()
{
    cin>>N;
    for(int i=1; i<=N; ++i)
    {
        cin>>val;
        ind[val]=i;
    }
    kindaciur();
    long long ans, prod,nrdiv,el;
    for(int i=1; i<=N; ++i)
    {
        for(int p=1; p<(1<<v[i].size()); ++p)
        {
            prod=1;
            nrdiv=0;
            for(int j=0; j<v[i].size(); ++j)
                if((1<<j)&p)
                {
                    ++nrdiv;
                    el=v[i][j];
                    prod=prod*v[i][j];
                }
            if(nrdiv%2==0)
                semn[prod]=1;
            else semn[prod]=-1;
            nr[prod]++;
        }
    }
    ans=N*(N-1)/2;
    for(int i=1; i<=NMAX; ++i)
        if(nr[i])
            ans=ans+1ll*semn[i]*(nr[i]*(nr[i]-1))/2;
    cout<<ans<<'\n';
    return 0;
}