Cod sursa(job #110035)

Utilizator SharpeBigadrian ursulescu SharpeBig Data 25 noiembrie 2007 16:27:52
Problema Pairs Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int F[1000006]={0},citit,i,n,j,lg,fact[20],expo[20]={0},M[100006],Acum;
long long rezultat=0;
   void factprimi(int);
   void factoridecat(int);
   void back1(int,int);
   void back2(int,int,int);


int main()
{  ifstream fin("pairs.in");
   ofstream fout("pairs.out");
   fin>>n;for(i=1;i<=n;fin>>M[i],factprimi(i++),back1(1,1));
   for(i=1;i<=n;factoridecat(i++),Acum=0,back2(1,1,0),rezultat+=Acum);
   fout<<rezultat/2;
   fin.close();fout.close();
   return 0;
}
   void back2(int nivel,int produs,int numar)
   {  if(nivel==lg+1)
      {  int x= numar%2>0 ? -1: +1;
         Acum+=x*F[produs];        
      }else
      {  back2(nivel+1,produs,numar);back2(nivel+1,produs*fact[nivel],numar+1); }        
   }
   void factoridecat(int i)
   {  lg=0;citit=M[i];
      if(citit%2==0)
      {  fact[++lg]=2;while(citit%2==0) citit/=2;  }
      for(j=3;(citit!=1)&&(j<=sqrt(citit));j+=2)
        if(citit%j==0)
        {  fact[++lg]=j;while(citit%j==0) citit/=j;  }
      if(citit!=1) fact[++lg]=citit;  
        
   }
   void factprimi(int i)
   {  lg=0;citit=M[i];
      if(citit%2==0)
      {  fact[++lg]=2;expo[lg]=0;while(citit%2==0) citit/=2,expo[lg]++;  }
      for (j=3;(citit!=1)&&(j<=sqrt(citit));j+=2)
      if (citit%j==0)
      {  fact[++lg]=j;expo[lg]=0;while(citit%j==0) citit/=j;expo[lg]++;  }     
      if(citit!=1) fact[++lg]=citit,expo[lg]=1;
   }
   void back1(int nivel,int produs)
   {  if(nivel==lg+1) F[produs]++; else
         for(int i=0;i<=expo[nivel];produs*=fact[nivel],i++)
            back1(nivel+1,produs);      
   }