Cod sursa(job #2504370)

Utilizator Cojocaru_Andrei_CristianCojocaru Andrei Cristian Cojocaru_Andrei_Cristian Data 4 decembrie 2019 21:04:09
Problema Pairs Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <vector>
using namespace std;
bool viz[1000005],cap_pajura[1000005];
int poz[1000005],nr[1000005];
vector <int>v[10005];
void ciur(int ma)
{
    viz[1]=viz[0]=1;
    if(poz[2])
       v[poz[2]].push_back(2);
    for(int i=4; i<=ma; i+=2)
    {
        if(poz[i]>0)
            v[poz[i]].push_back(2);
        viz[i]=1;
    }
    for(int i=3; i<=ma; i+=2)
    {
        if(viz[i]==0)
        {
            for(int j=i; j<=ma; j+=i)
            {
                viz[j]=1;
                if(poz[j]>0)
                    v[poz[j]].push_back(i);
            }
        }
    }

}
int main()
{
    int n,x,ma=-1;
    cin>>n;
    long long init=(long long)n*((long long)n-1)/2;
    for(int i=1; i<=n; i++)
    {
        cin>>x;
        poz[x]=i;
        ma=max(ma,x);
    }
    ciur(ma);
    for(int i=1; i<=n; i++)
    {
        int pas=v[i].size();
        for(int j=1; j<(1<<v[i].size()); j++)
        {
            int cnt1=1,cnt2=0;
            for(int t=0; t<v[i].size(); t++)
            {
                if(j&(1<<t))
                {
                    cnt1=cnt1*v[i][t];
                    cnt2++;
                }
            }
            nr[cnt1]++;
            cap_pajura[cnt1]=(bool)cnt2%2;
        }
    }
    long long sol=0;
    for(int i=2; i<=ma; i++)
        {
            long long temp=(long long)nr[i]*((long long)nr[i]-1)/2;
            if(cap_pajura[i]==1)
                   sol+=temp;
            else
                   sol-=temp;
        }
    cout<<init-sol;
    return 0;
}