Pagini recente » Cod sursa (job #1006364) | Cod sursa (job #1737900) | Cod sursa (job #1888409) | Cod sursa (job #2153286) | Cod sursa (job #110043)
Cod sursa(job #110043)
//#define DEBUG
#include <cstdio>
#ifdef DEBUG
#include <iostream>
#endif
#include <vector>
using namespace std;
#define NMAX 100005
#define MAXRANGE 1000000
#define pb push_back
int N, x[NMAX];
vector <int> v[NMAX];
int cnt[MAXRANGE];
long long sol=0;
void desc(int x, vector <int> &v)
{
int i=2;
while(x>1 && i*i<=x)
{
if(x%i==0)
{
while(x%i==0)
x/=i;
v.pb(i);
}
++i;
}
if(x>1)
v.pb(x);
}
void back0(int k, int p, const vector <int> &v)
{
if(k==(int)v.size())
{
cnt[p]++;
return;
}
back0(k+1,p,v);
back0(k+1,p*v[k],v);
}
void read_data()
{
scanf("%d",&N);
for(int i=0; i<N; ++i)
{
scanf("%d",&x[i]);
desc(x[i],v[i]);
back0(0,1,v[i]);
}
}
void back(int k, int p, int nr, const vector <int> &v)
{
if(k==(int)v.size())
{
if(nr)
if(nr&1)
sol-=cnt[p]-1;
else
sol+=cnt[p]-1;
return;
}
back(k+1,p,nr,v);
back(k+1,p*v[k],nr+1,v);
}
int main()
{
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
read_data();
#ifdef DEBUG
for(int i=0; i<N; ++i)
{
cerr<<x[i]<<": ";
for(unsigned j=0; j<v[i].size(); ++j)
cerr<<v[i][j]<<" ";
cerr<<endl;
}
cerr<<endl;
for(int i=0; i<MAXRANGE; ++i)
if(cnt[i])
cerr<<i<<"->"<<cnt[i]<<endl;
#endif
for(int i=0; i<N; ++i)
{
sol+=N-1;
back(0,1,0,v[i]);
}
printf("%Ld\n",sol/2);
return 0;
}