Cod sursa(job #2095615)

Utilizator zhm248Mustatea Radu zhm248 Data 27 decembrie 2017 19:47:57
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<cstdio>
#include<cmath>
using namespace std;
bool f[1000001],c[1000001];
int v[700001],nr,prodx[700001],prody[700001],prodnr[700001],x[700001];
void ciur(int n)
{
    v[++nr]=2;
    for(int i=4;i<=n;i+=2)
    {
        c[i]=1;
    }
    int lim=(int)sqrt(n);
    for(int i=3;i<=lim;i+=2)
    {
        if(!c[i])
        {
            v[++nr]=i;
            for(int j=(i*i)+2*i;j<=n;j+=(2*i))
            {
                c[j]=1;
            }
        }
    }
    if(lim%2==0)
        lim++;
    else
        lim+=2;
    for(int i=lim;i<=n;i+=2)
    {
        if(!c[i])
            v[++nr]=i;
    }
}

int main()
{
    freopen("pairs.in","r",stdin);
    freopen("pairs.out","w",stdout);
    int n,i,y,maxim=0,j;
    scanf("%d",&n);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&y);
        f[y]=1;
        if(maxim<y)
            maxim=y;
    }
    for(i=2;i<=maxim;++i)
    {
        for(j=1;j<=maxim/i;++j)
        {
            if(f[i*j])
                x[i]++;
        }
    }
    ciur(maxim);
    prodx[0]=1;
    int ultim=0;
    long long sol=0;
    for(i=0;i<=ultim;++i)
    {
        for(j=prody[i]+1;j<=nr;++j)
        {
            if(prodx[i]<=maxim/v[j])
            {
                prodx[++ultim]=prodx[i]*v[j];
                prody[ultim]=j;
                prodnr[ultim]=prodnr[i]+1;
            }
        }
        if(prodnr[i]%2)
            sol+=((1LL*x[prodx[i]]*(x[prodx[i]]-1))/2);
        else
            sol-=((1LL*x[prodx[i]]*(x[prodx[i]]-1))/2);
    }
    printf("%lld\n",(1LL*n*(n-1))/2-sol);
    return 0;
}