Cod sursa(job #110572)

Utilizator VmanDuta Vlad Vman Data 26 noiembrie 2007 23:13:46
Problema Pairs Scor 0
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[]={ 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 t)
{
 int i=1,k=0;
 while (nr*i<=xmax)
       {
        if (w[nr*i]) ++k;
        ++i;
       }
 res=res+t*k*(k-1)/2;
}

void get_number(int nr,int i,int t)
{
 if (nr>xmax) return;
 if (i==nrp) { search(nr,t);return; }
 get_number(nr,i+1,t);
 get_number(nr*p[i],i+1,-t);
}

void solve()
{
 int i;
 for (i=0;i<nrp;++i)
     get_number(p[i],i+1,-1);
}

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;
     }
 res=N*(N-1)/2;
 solve();
 printf("%lld",res);
 fclose(stdin);
 fclose(stdout);
 return 0;
}