Pagini recente » Cod sursa (job #12226) | Cod sursa (job #106464) | Cod sursa (job #888319) | Cod sursa (job #107780) | Cod sursa (job #930939)
Cod sursa(job #930939)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int MV=1000000;
char c[1000100];
int f[1000100];
void ciur()
{
for(int i=1;i<=MV;i++)
f[i]=i;
for(int d=2;d*d<=MV;d+=2)
{
if(!c[d])
{
f[d]=d;
for(int i=d+d;i<=MV;i+=d)
{
c[i]=1;
f[i]=d;
}
}
if(d==2)
d--;
}
}
vector <int> desc(int a)
{
vector<int>V;
while(a!=1)
{
V.push_back(f[a]);
int fact=f[a];
while(a%fact==0)
a/=fact;
}
return V;
}
int v[1000100];
int pinex(int x,int c)
{
vector<int>fact=desc(x);
int n=fact.size();
int sol=0;
for(int i=1;i<(1<<n);i++)
{
int biti=0;
int prod=1;
for(int b=0;b<n;b++)
if(i&(1<<b))
{
biti++;
prod*=fact[b];
}
if(biti%2)
sol+=v[prod];
else
sol-=v[prod];
v[prod]++;
}
return c-sol-1;
}
int main()
{
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
ciur();
int n;
scanf("%d",&n);
long long sol=0;
for(int i=1;i<=n;i++)
{
int a;
scanf("%d",&a);
sol+=pinex(a,i);
}
printf("%lld",sol);
return 0;
}