Cod sursa(job #110132)

Utilizator SharpeBigadrian ursulescu SharpeBig Data 25 noiembrie 2007 18:23:28
Problema Pairs Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <cmath>
#include <iostream>
using namespace std;

int F[1000006]={0},i,n,j,fact[100006][10],expo[100006][10]={0},citit,lg[100006]={0},acum,radic;
int Sqrt[1000006];
char sir[20];
long long rezultat=0;
   void back(int,int);
   void back2(int,int,int);

int main()
{  ifstream fin("pairs.in");
   ofstream fout("pairs.out");
   for(i=1000000,radic=1000;i>=1;i--)
   {  if(radic*radic>i) radic--; Sqrt[i]=radic+1; }
   fin>>n;for(i=1;i<=n;i++)
   {  fin>>sir;j=2;citit=atoi(sir);
      if (citit%j==0)                                             
      {  fact[i][++lg[i]]=j;while(citit%j==0) citit/=j,expo[i][lg[i]]++;  }
      for(;citit!=1&&j<=Sqrt[citit];j++)
      if (citit%j==0)
      {  fact[i][++lg[i]]=j;while(citit%j==0) citit/=j,expo[i][lg[i]]++;  }
      if (citit!=1)  { fact[i][++lg[i]]=citit;expo[i][lg[i]]=1;  }
      back(1,1);
   }
   for(i=1,acum=0;i<=n;back2(1,1,1),rezultat+=acum,acum=0,i++);
   fout<<rezultat/2;   
   fin.close();fout.close();
   return 0;   
}
   void back2(int nivel,int produs,int numar)
   {  if(nivel==lg[i]+1) acum+=numar*F[produs];else
      {  back2(nivel+1,produs,numar);back2(nivel+1,produs*fact[i][nivel],-numar);  }
   }
   void back(int nivel,int produs)
   {  if(nivel==lg[i]+1) F[produs]++;else
      {  for(int j=0;j<=expo[i][nivel];produs*=fact[i][nivel],j++)
            back(nivel+1,produs);
      }
   }