Pagini recente » Cod sursa (job #18274) | Cod sursa (job #1299705) | Cod sursa (job #705039) | Cod sursa (job #1546580) | Cod sursa (job #3176997)
#include <bits/stdc++.h>
#ifdef LOCAL
#define in cin
#define out cout
#endif
#define int int64_t
using namespace std;
#ifndef LOCAL
ifstream in("pairs.in");
ofstream out("pairs.out");
#endif
const int valmax = 1e6+5;
const int sqmax = 1e3+5;
bool ciur[sqmax];
int morb[valmax];
int freq[valmax];
vector<int> primes;
void euler()
{
primes.push_back(2);
for(int i=3;i<sqmax;i+=2)
{
if(!ciur[i])
{
primes.push_back(i);
for(int j=i*i;j<sqmax;j+=i)
{
ciur[j]=1;
}
}
}
}
void morbius()
{
for(int i=1;i<valmax;i++)morb[i]=1;
for(auto i:primes)
{
for(int j=i;j<valmax;j+=i)morb[j]*=-1;
for(int j=i*i;j<valmax;j+=i*i)morb[j]=0;
}
}
void ion()
{
for(int i=2;i<valmax;i++)
{
if(morb[i]==0)continue;
for(int j=2*i;j<valmax;j+=i)
{
freq[i]+=freq[j];
}
}
}
int32_t main()
{
euler();
morbius();
int n;in>>n;
for(int i=0;i<n;i++)
{
int nr;in>>nr;
freq[nr]++;
}
ion();
int ans = n*(n-1)/2;
for(int i=2;i<valmax;i++)
{
ans+=morb[i]*freq[i]*(freq[i]-1)/2;
//if(freq[i]!=0)cerr<<i<<' '<<morb[i]<<' '<<freq[i]<<'\n';
}
out<<ans;
}