Cod sursa(job #1419651)

Utilizator chiriacandrei25Chiriac Andrei chiriacandrei25 Data 16 aprilie 2015 01:06:14
Problema Pairs Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <cstdio>
#include <algorithm>
#define ValMax 1000005

using namespace std;

bool fr[ValMax];
int cnt[ValMax],ciur[ValMax],a[100005],len[100005];
int v[100005][9];

inline void Desc(int lin, int x)
{
    int d=3,k=0;
    len[lin]=0;
    while(x%2==0)
    {
        ++k;
        x/=2;
    }
    if(k) v[lin][++len[lin]]=2;
    while(x>1 && d*d<=x)
    {
        k=0;
        while(x%d==0)
        {
            ++k;
            x/=d;
        }
        if(k) v[lin][++len[lin]]=d;
        d+=2;
    }
    if(x>1) v[lin][++len[lin]]=x;
}

int main()
{
    int n,i,j,x,nr,produs,stare,Maxim=0;
    long long sol=0;
    freopen ("pairs.in","r",stdin);
    freopen ("pairs.out","w",stdout);
    scanf("%d", &n);
    for(i=1;i<=n;++i)
    {
        scanf("%d", &a[i]);
        Maxim=max(Maxim,a[i]);
        Desc(i,a[i]);
        for(stare=1;stare<(1<<len[i]);++stare)
        {
            produs=1;
            for(j=0;j<len[i];++j)
                if((1<<j)&stare)
                    produs=produs*v[i][j+1];
            ++cnt[produs];
        }
    }
    cnt[1]=n;
    for(i=2;i<=Maxim;++i)
        if(!ciur[i])
        {
            sol+=1LL*cnt[i]*(cnt[i]-1)/2;
            for(j=i*2;j<=Maxim;j+=i) ++ciur[j];
        }
        else
        {
            sol-=1LL*cnt[i]*(cnt[i]-1)/2*(ciur[i]-1);
            for(j=i*2;j<=Maxim;j+=i) ciur[j]-=ciur[i]-1;
        }
    printf("%lld\n", 1LL*n*(n-1)/2-sol);
    return 0;
}