Cod sursa(job #1344569)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 16 februarie 2015 20:36:32
Problema Pairs Scor 0
Compilator cpp Status done
Runda prega_rav_1 Marime 1.37 kb
#include <stdio.h>
#include <cmath>
bool apar[1000001],bun[1000001];
int num[100001],ap[1000001];
int n;
int main()
{
    freopen ("pairs.in","r",stdin);
    freopen ("pairs.out","w",stdout);
    scanf("%d",&n);
    int cap=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&num[i]);
        apar[num[i]]=1;
        if(cap<num[i]) cap=num[i];
    }
    for(int i=1;i<=cap;i++)
    {
        for(int j=1;j<=cap/i;j++)
        {
            if(apar[i*j]==1) ap[i]++;
        }
    }
    for(int i=2;i<=cap;i++)
    {
        if(bun[i]==0) for(int j=i;j<=cap/i;j+=i) bun[i*j]=1;
    }
    //for(int i=1;i<=cap;i++) printf("%d %d\n",i,ap[i]);
    long long sum=0;
    for(int i=2;i<=cap;i++)
    {
        if(bun[i]==0)
        {
            int temp=i;
            int counter=0;
            int si=sqrt(temp);
            if(temp%2==0)
            {
                counter++;
                temp/=2;
            }
            for(int j=3;j<=si;j+=2)
            {
                if(temp%j==0)
                {
                    temp/=j;
                    counter++;
                    if(temp==1) break;
                }
            }
            if(counter==0) counter=1;
            if(counter%2==1) sum+=ap[i]*(ap[i]-1)/2;
            else sum-=ap[i]*(ap[i]-1)/2;
        }
    }
    sum=n*(n-1)/2-sum;
    printf("%lld\n",sum);
}