Cod sursa(job #3224042)

Utilizator AlexPlesescuAlexPlesescu AlexPlesescu Data 14 aprilie 2024 13:11:15
Problema Pairs Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

#define NMAX 100020

long int a[NMAX],h[NMAX*10],pr[NMAX],k,n,m,v[NMAX];
char ax[NMAX*10];
long long i,j,sol,sol2;


void ciur()
{

    for (i=2; i<=m; i++)
        ax[i]=1;

    for (i=2; i<=m; i++)
        if (ax[i])
        {
            pr[ ++pr[0] ]=i;
            for (j=i*i; j<=m; j+=i)
                ax[j]=0;
        }
}

void back(long int nivel, long int nr1, long int nr)
{
    if (nivel==k+1)
    {
        if (nr1==0) return;

        if (nr1%2==0) sol2-=h[nr];
        else sol2+=h[nr];

        h[nr]++;
        return;
    }

    back(nivel+1,nr1,nr);
    back(nivel+1,nr1+1,nr*v[nivel]);
}

int main()
{
    freopen("pairs.in","r",stdin);
    freopen("pairs.out","w",stdout);
    cin.tie(0)->sync_with_stdio(false);

    cin >> n;
    for (i=1; i<=n; i++)
        cin >> a[i];

    m=2000;

    sort(a+1,a+n+1);

    ciur();

    for (i=1; i<=n; i++)
    {
        k=a[i];
        v[0]=0;
        for (j=1; pr[j]*pr[j]<=k; j++)
        {
            if (k%pr[j]==0)
            {
                v[ ++v[0] ] = pr[j];
                for (; k%pr[j]==0; k/=pr[j]);
            }
        }

        if (k>1) v[++v[0] ] = k;

        k=v[0];

        sol2=0;
        back(1,0,1);
        sol+=i-1-sol2;
    }
    cout << sol;
    return 0;
}