Cod sursa(job #213713)

Utilizator alexeiIacob Radu alexei Data 11 octombrie 2008 10:32:58
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<stdio.h>
#define NMAX 1000024
int div[NMAX],R[NMAX];
bool P[NMAX];
inline int max(const int a,const int b){return a>b?a:b;}
int main()
{
    freopen("pairs.in","r",stdin);
    freopen("pairs.out","w",stdout);
    
    int N,MMAX=-1;
    scanf("%d",&N);
    int i,j,a1;
    long long solfin=(long long)N*(N-1)/2;//numar toate posib.
    for(i=1; i<=N; ++i)
    {
             scanf("%d",&a1);
             MMAX=max(MMAX,a1);
             div[a1]=1;
    }
    long long aux;
    for(i=2; i<=MMAX; ++i)
    {
             for(j=i+i; j<=MMAX; j+=i)         
             {
                        if( div[j] )
                        ++div[i];
             }
             
             if( P[i]==false )
             {
                 R[i]=1;
                 
                 for(j=i+i; j<=MMAX; j+=i)
                 {
                            P[j]=true;
                            
                            if( R[j]!=-1 )
                            {
                                if( (j/i)%i==0 )
                                R[j]=-1;
                                else
                                ++R[j];
                            }                        
                 }
             }
             
             if( R[i]!=-1 && div[i] )
             {
                 aux=(long long)div[i]*(div[i]-1)/2;
                 if( R[i]%2==0 )
                 {
                     solfin+=aux;
                 }
                 else
                 {
                     solfin-=aux;
                 }
             }
    }
    
    printf("%lld\n",solfin);
    return 0;
}