Cod sursa(job #2504681)

Utilizator Cojocaru_Andrei_CristianCojocaru Andrei Cristian Cojocaru_Andrei_Cristian Data 5 decembrie 2019 12:58:36
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <vector>
using namespace std;
bool viz[1000105],cap_pajura[1000105];
int poz[1000105],nr[1000105];
vector <int>v[100005];
void ciur(int ma)
{
    viz[1]=viz[0]=1;
    if(poz[2]>0)
       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()
{
    ifstream cin("pairs.in");
    ofstream cout("pairs.out");
    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++)
    {
        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)(cap_pajura[cnt1]+cnt2%2)%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]==true)
                   sol+=temp;
            else
                   sol-=temp;
        }
    cout<<init-sol;
    return 0;
}