Cod sursa(job #1344565)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 16 februarie 2015 20:31:19
Problema Pairs Scor 0
Compilator cpp Status done
Runda prega_rav_1 Marime 1.56 kb
#include <stdio.h>
#include <cmath>
bool apar[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=1;i<=cap;i++) printf("%d %d\n",i,ap[i]);
    long long sum=0;
    for(int i=2;i<=cap;i++)
    {
        int counter=0,temp=i;
        bool as=0;
        if(temp%2==0)
        {
            temp/=2;
            if(temp%2==0)
            {
                as=1;
            }
            counter++;
        }
        if(as==0)
        {
            int siz=sqrt(i);
            if(temp!=1) for(int j=3;j<=siz;j+=2)
            {
                if(temp%j==0)
                {
                    counter++;
                    temp/=j;
                    if(temp%j==0)
                    {
                        as=1;
                        break;
                    }
                    if(temp==1) break;
                }
            }
            if(temp==i) counter++;
            if(as==0)
            {
                if(temp==num[i]) counter++;
                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);
}