Cod sursa(job #110609)

Utilizator VmanDuta Vlad Vman Data 27 noiembrie 2007 00:04:45
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
using namespace std;
#include <stdio.h>

#define Nmax 100001
#define Xmax 1000001
#define nrp 168

int p[nrp]={ 2,      3,      5,      7,     11,     13,     17,     19,     23,     29,
     31,     37,     41,     43,     47,     53,     59,     61,     67,     71,
     73,     79,     83,     89,     97,    101,    103,    107,    109,    113,
    127,    131,    137,    139,    149,    151,    157,    163,    167,    173,
    179,    181,    191,    193,    197,    199,    211,    223,    227,    229,
    233,    239,    241,    251,    257,    263,    269,    271,    277,    281,
    283,    293,    307,    311,    313,    317,    331,    337,    347,    349,
    353,    359,    367,    373,    379,    383,    389,    397,    401,    409,
    419,    421,    431,    433,    439,    443,    449,    457,    461,    463,
    467,    479,    487,    491,    499,    503,    509,    521,    523,    541,
    547,    557,    563,    569,    571,    577,    587,    593,    599,    601,
    607,    613,    617,    619,    631,    641,    643,    647,    653,    659,
    661,    673,    677,    683,    691,    701,    709,    719,    727,    733,
    739,    743,    751,    757,    761,    769,    773,    787,    797,    809,
    811,    821,    823,    827,    829,    839,    853,    857,    859,    863,
    877,    881,    883,    887,    907,    911,    919,    929,    937,    941,
    947,    953,    967,    971,    977,    983,    991,    997 };

int x[Nmax],i,xmax;
long long N,res;
char w[Xmax];

inline int max(int a,int b) { return a>b?a:b; }

void search(int nr)
{
 int i=1,t=1;
 long long k=0;
 while (nr*i<=xmax)
   	{
         if (w[nr*i]) ++k;
         ++i;
        }
 if (k<2) return;
 for (i=0;i<nrp && p[i]<nr;++i)
     if (nr%p[i]==0)
       	{
         t=-t;
         nr/=p[i];
         if (nr%p[i]==0) return;
        }
 if (nr>0) t=-t;
 res+=t*k*(k-1)/2;
}

int main()
{
 freopen("pairs.in","r",stdin);
 freopen("pairs.out","w",stdout);
 scanf("%lld",&N);
 for (i=1;i<=N;++i)
     {
      scanf("%d",&x[i]);
      xmax=max(xmax,x[i]);
      w[x[i]]=1;
     }
 //get_prim();
 res=N*(N-1)/2;
 for (i=2;i<xmax;++i)
    	search(i);
 //solve();
 printf("%lld",res);
 fclose(stdin);
 fclose(stdout);
 return 0;
}