Pagini recente » Cod sursa (job #3212260) | Cod sursa (job #37977) | Cod sursa (job #1167180) | Cod sursa (job #862050) | Cod sursa (job #110035)
Cod sursa(job #110035)
#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);
}