Pagini recente » Cod sursa (job #1848204) | Cod sursa (job #3225364) | Cod sursa (job #2435958) | Cod sursa (job #1674898) | Cod sursa (job #3266025)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("pairs.in");
ofstream fout("pairs.out");
int n, x, i, divi[1000005], ans, sum, j, maxim, fr[1000005], ciur[1000005];
vector <int> divz;
int main()
{
fin>>n;
for(i=1; i<=n; i++)
{
fin>>x;
fr[x]++;
maxim=max(maxim, x);
}
for(i=1; i<=maxim; i++)
{
int p=1;
while(i*p<=maxim)
{
divi[i]+=fr[i*p];
p++;
}
}
ciur[0]=ciur[1]=1;
for(i=2; i<=maxim; i++)
if(ciur[i]==0)
{
divz.push_back(i);
for(j=2*i; j<=maxim; j+=i)
ciur[j]=1;
}
int k=divz.size();
for(int mask=0; mask<(1<<k); mask++)
{
int nr=0, p=1;
for(i=0; i<k; i++)
if(mask&(1<<i))
{
nr++;
p*=divz[i];
}
if(nr!=0)
{
if(nr%2)
ans+=divi[p]*(divi[p]-1)/2;
else
ans-=divi[p]*(divi[p]-1)/2;
}
}
fout<<n*(n-1)/2-ans;
return 0;
}