Pagini recente » Cod sursa (job #1328393) | Cod sursa (job #1229323) | Cod sursa (job #2901384) | Cod sursa (job #186851) | Cod sursa (job #2564191)
#include <fstream>
#include <vector>
#define NMAX 1000000
using namespace std;
ifstream cin("pairs.in");
ofstream cout("pairs.out");
vector < vector <int> > v(100100);
int ind[NMAX+10], N, val, nr[NMAX+10];
short semn[NMAX+10];
bool ciur[NMAX+10];
inline void kindaciur()
{
if(ind[2])
v[ind[2]].push_back(2);
for(int d=4; d<=NMAX; ciur[d]=1,d+=2)
if(ind[d])
v[ind[d]].push_back(2);
for(int d=3; d*2<=NMAX; d+=2)
if(!ciur[d])
{
if(ind[d])
v[ind[d]].push_back(d);
for(int j=d*2; j<=NMAX; ciur[j]=1,j+=d)
if(ind[j])
v[ind[j]].push_back(d);
}
}
int main()
{
cin>>N;
for(int i=1; i<=N; ++i)
{
cin>>val;
ind[val]=i;
}
kindaciur();
long long ans, prod,nrdiv,el;
for(int i=1; i<=N; ++i)
{
for(int p=1; p<(1<<v[i].size()); ++p)
{
prod=1;
nrdiv=0;
for(int j=0; j<v[i].size(); ++j)
if((1<<j)&p)
{
++nrdiv;
el=v[i][j];
prod=prod*v[i][j];
}
if(nrdiv%2==0)
semn[prod]=1;
else semn[prod]=-1;
nr[prod]++;
}
}
ans=N*(N-1)/2;
for(int i=1; i<=NMAX; ++i)
if(nr[i])
ans=ans+1ll*semn[i]*(nr[i]*(nr[i]-1))/2;
cout<<ans<<'\n';
return 0;
}