Cod sursa(job #418935)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 16 martie 2010 18:54:59
Problema Pairs Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<iostream>
#include<string>

using namespace std;

#define MAX 1000005
#define LL long long

char este[MAX];
int pecate[MAX],catip[MAX];

int main()
{
    int N,nr,nmax=0;
    
    freopen("pairs.in","r",stdin);
    freopen("pairs.out","w",stdout);
    
    scanf("%d",&N);
    
    for(int i=1;i<=N;++i)
    {
        scanf("%d",&nr);    
        este[nr]=1;
        nmax=max(nr,nmax);
    }
    
    for(int i=2;i<=nmax;++i)
       if(!catip[i])
       {
           catip[i]=1;         
                    
           for(LL j=(LL)i*i;j<=nmax;j+=((LL)i*i))     
              catip[j]=-1;
           
           for(int j=2*i;j<=nmax;j+=i)
              if(catip[j]>=0) ++catip[j];         
       }
    /*
    for(int i=2;i<=nmax;++i)
       printf("%d ",catip[i]);
    */
    
    for(int i=2;i<=nmax;++i)
       if(catip[i]>=0)
       {
           for(int j=i;j<=nmax;j+=i)
              if(este[j]) ++pecate[i];           
       }
    
    LL ans=0;
    
    for(int i=2;i<=nmax;++i)
      if(catip[i]>=0) if(catip[i]%2) ans+=(LL)(pecate[i]*(pecate[i]-1))/2;
                      else ans-=(LL)(pecate[i]*(pecate[i]-1))/2;   
    
    printf("%I64d",(LL)(N*(N-1))/2 - ans);   
    
    return 0;
}