Pagini recente » Cod sursa (job #3270052) | Cod sursa (job #2926303) | Cod sursa (job #61267) | Cod sursa (job #2730632) | Cod sursa (job #918277)
Cod sursa(job #918277)
#include<stdio.h>
#include<vector>
using namespace std;
vector<int> primes,p;
int d[1000005],f[1000005],a[100005];
void build_primes()
{
d[1]=1;
for(int i=2;i<=1000000;i++)
if(!d[i])
{
primes.push_back(i);
for(int j=i;j<=1000000;j+=i) d[j]=i;
}
}
void build(int x,int last)
{
if(x==1) return;
if(last!=d[x])
p.push_back(d[x]);
build(x/d[x],d[x]);
}
void biti(int &x,int &semn,int config)
{
semn=1;x=1;
for(int b=0;b<(int)p.size();b++)
if(config&(1<<b))
{
semn=-semn;
x*=p[b];
}
}
int main()
{
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
int n,i,j,aux,ans,semn;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
build_primes();
for(i=1;i<=n;i++)
{
p.clear();
build(a[i],-1);
for(j=1;j<(1<<p.size());j++)
biti(aux,semn,j),f[aux]++;
}
long long rez=0;
for(i=1;i<=n;i++)
{
p.clear();
build(a[i],-1);
ans=n;
for(j=1;j<(1<<p.size());j++)
biti(aux,semn,j),ans+=semn*f[aux];
rez=rez+ans;
}
printf("%lld\n",rez/2);
return 0;
}