Pagini recente » Cod sursa (job #3162285) | Cod sursa (job #794882) | Cod sursa (job #2658239) | Cod sursa (job #2941089) | Cod sursa (job #3218992)
#include <fstream>
using namespace std;
ifstream fin("pairs.in");
ofstream fout("pairs.out");
int n,ciur[1000001],nr,v[80000],fac[30],nrf,x,ind[1000001],numere;
struct numar
{
int prod,semn,val;
}factori[1000001];
int main()
{
fin>>n;
ciur[0]=ciur[1]=1;
for(int i=1;i<=1000000;i++)
{
if(ciur[i]==0)
{
nr++;
v[nr]=i;
for(int j=i+i;j<=1000000;j+=i)
{
ciur[j]=1;
}
}
}
for(int i=1;i<=n;i++)
{
fin>>x;
nrf=0;
for(int d=1;v[d]*v[d]<=x;d++)
{
if(x%v[d]==0)
{
nrf++;
fac[nrf]=v[d];
while(x%v[d]==0 && x!=1)
{
x=x/v[d];
}
}
}
if(x!=1)
{
nrf++;
fac[nrf]=x;
}
int l=(1<<nrf)-1;
for(int p=1;p<=l;p++)
{
int nrcif=0;
int prod=1;
for(int j=0;j<nrf;j++)
{
if((p>>j)&1)
{
nrcif++;
prod=prod*fac[j+1];
}
}
if(ind[prod]==0)
{
numere++;
ind[prod]=numere;
int coef=1;
if(nrcif%2==0)
coef=-1;
factori[numere]={prod,coef,1};
}
else
factori[ind[prod]].val++;
}
}
long long calc=1ll*n*(n-1)/2;
long long val=0;
for(int i=1;i<=numere;i++)
{
long long temp=1ll*factori[i].semn*(1ll*factori[i].val*(factori[i].val-1)/2);
val=val+temp;
}
calc=calc-val;
fout<<calc;
return 0;
}