Cod sursa(job #286842)

Utilizator mihaionlyMihai Jiplea mihaionly Data 24 martie 2009 11:23:44
Problema Pairs Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <fstream>
using namespace std;
#define dim 1000090
#define abs(x) (x>0)?(x):(-x)
typedef long long ll;
ifstream f("pairs.in");
ofstream g("pairs.out");
long n,mx=0,nr;
long divx[dim],p[dim];
bool ok[dim];
ll res;
void read()
 {
 long i;
 for(i=1;i<=n;i++)
  {
  f>>nr;
  ok[nr]=1;
  if(mx<nr)
   mx=nr;
  }
 }
void solve()
 {
 int j,i;
 for(i=2;i<=mx;i++) //numar cati divizori are nr de la 2 la maxim
  {
   for(j=i;j<=mx;j+=i) //incep de la indice si continui cu multiplii sai
    {
    if(ok[j]) //daca il am in sir,divizorii indicelui cresc
     divx[i]++;
    }
  }
 for(i=2;i<=mx;i++)
  {
  if(p[i]==0)
   {
   for(j=2*i;j<=mx;j+=i)
    if(p[j]!=-1&&j%(i*i))
     p[j]++;
    else
     p[j]=-1;
   }
  }
 for(i=2;i<=mx;i++)
  {
  if(p[i]>=0)
   {
   if(p[i]==0)
    p[i]=1;
   if(p[i]%2==1)
    res+=(ll)(divx[i]*(divx[i]-1))/2;
   else
    res-=(ll)(divx[i]*(divx[i]-1))/2;
   }  
  }
 res=abs((ll)(n*(n-1))/2-res);
 g<<res;
 }
int main()
 {
 f>>n;
 read();
 solve();
 return 0;
 }