Cod sursa(job #2095628)

Utilizator zhm248Mustatea Radu zhm248 Data 27 decembrie 2017 20:15:54
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<cstdio>
using namespace std;
bool f[1000001];
int x[1000001];
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]++;
        }
    }
    long long sol=0;
    for(i=2;i<=maxim;++i)
    {
        bool ok=1;
        int u=i,nr=0;
        if(u%2==0)
        {
            nr++;
            if(u%4==0)
                ok=0;
            else
                u/=2;
        }
        if(ok)
        {
            int j=3;
            while(j*j<=u)
            {
                if(u%j==0)
                {
                    if(u%(j*j)==0)
                    {
                        ok=0;
                        break;
                    }
                    else
                    {
                        u/=j;
                        nr++;
                    }
                }
                j+=2;
            }
            if(ok)
            {
                if(u>1)
                nr++;
                if(nr%2)
                    sol+=((1LL*x[i]*(x[i]-1))/2);
                else
                    sol-=((1LL*x[i]*(x[i]-1))/2);
            }
        }
    }
    printf("%lld\n",((1LL*n*(n-1))/2)-sol);
    return 0;
}