Cod sursa(job #1259310)

Utilizator rzvrzvNicolescu Razvan rzvrzv Data 9 noiembrie 2014 21:59:32
Problema Pairs Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include<cstdio>
#include<algorithm>

using namespace std;

long long res,rez;
bool c[1000002],treu,d[1000002],m[1000002];
int nr[1000002],i,mx,a[100002],n,j,s[1000002];

int main()
{
    freopen("pairs.in","r",stdin);
    freopen("pairs.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        mx=max(mx,a[i]);
        m[a[i]]=true;
    }
    rez=1LL*n*(n-1)/2;
    for(i=2;i<=mx;i++)
    {
        treu=c[i];
        if(!treu&&i<=mx/i)
        {
            for(j=i*i;j<=mx;j+=i*i)
            {
                d[j]=true;
            }
            for(j=i*i;j<=mx;j+=i)
            {
                c[j]=true;
            }
        }
        if(!treu)
        {
            for(j=i;j<=mx;j+=i)
            {
                nr[j]^=1;
            }
        }
        for(j=i;j<=mx;j+=i)
        {
            if(m[j])
            {
                s[i]++;
            }
        }
    }
    for(i=2;i<=mx;i++)
    {
        if(!d[i])
        {
            res=1LL*s[i]*(s[i]-1)/2;
            if(nr[i]==1)
            {
                rez-=res;
            }
            else
            {
                rez+=res;
            }
        }
    }
    printf("%d\n",rez);
}