Pagini recente » Cod sursa (job #2424357) | Monitorul de evaluare | Cod sursa (job #1705364) | Cod sursa (job #2508145) | Cod sursa (job #470523)
Cod sursa(job #470523)
#include <cstdio>
#include <cstring>
#include <cmath>
#define file_in "pairs.in"
#define file_out "pairs.out"
#define Max 1000
#define nmax 101000
int n,v[nmax];
long long x[nmax];
int q[nmax];
int w[100];
void citire()
{
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
int i;
scanf("%d", &n);
for (i=1;i<=n;++i)
scanf("%d", &v[i]);
}
int prim(int X)
{
int i,rad=(int)(sqrt(X));
for (i=2;i<=rad;++i)
if (X%i==0)
return 0;
return 1;
}
void solve()
{
int i,j,k,e,nrr,prod,nr,nrd=0;
for (i=2;i<=Max;++i)
if (prim(i))
q[++nrd]=i;
long long sol=0;
for (i=1;i<=n;++i)
{
e=0;
for (j=1;j<=nrd;++j)
if (v[i]%q[j]==0)
{
w[++e]=q[j];
while(v[i]%q[j]==0)
v[i]/=q[j];
}
if (v[i]>1)
w[++e]=v[i];
sol+=(i-1);
for (k=1;k<(1<<e);++k)
{
prod=1;
nrr=0;
for (j=1;j<=e;++j)
if (k&(1<<(j-1)))
{
prod*=w[j];
nrr++;
}
if (nrr&1)
sol-=x[prod];
else
sol+=x[prod];
}
for (k=1;k<(1<<e);++k)
{
prod=1;
for (j=1;j<=e;++j)
if (k&(1<<(j-1)))
{
prod*=w[j];
}
x[prod]++;
}
}
printf("%lld", sol);
}
int main()
{
citire();
solve();
fclose(stdin);
fclose(stdout);
return 0;
}