Pagini recente » Cod sursa (job #3235414) | Cod sursa (job #708436) | Cod sursa (job #2070827) | Cod sursa (job #1757912) | Cod sursa (job #110119)
Cod sursa(job #110119)
#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;
char *sir;
long long rezultat=0;
void back(int,int);
void back2(int,int,int);
int main()
{ ifstream fin("pairs.in");
ofstream fout("pairs.out");
fin>>n;for(i=1;i<=n;i++)
{ fin>>sir;j=2;citit=atol(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);
}
}