Pagini recente » Cod sursa (job #2819570) | Cod sursa (job #43732) | Cod sursa (job #37099) | Cod sursa (job #2588958) | Cod sursa (job #3271131)
#include <bits/stdc++.h>
#define int long long
#define MOD 666013
using namespace std;
bitset<1005> notprime;
int prime[200],cntprime;
short mobius[1000005];
int fr[1000005];
void ciur()
{
for(int i=2; i<1005; ++i)
if(!notprime[i])
{
prime[cntprime++] = i;
for(int j=i*i; j<1005; j+=i)
notprime[j] = 1;
}
for(int i=1; i<1000005; ++i) mobius[i] = -2;
for(int i=2; i<1000005; ++i)
if(mobius[i] == -2)
{
mobius[i] = 1;
for(int j=i+i; j<1000005; j+=i)
if(j/i%i == 0)
mobius[j] = 0;
else
mobius[j] = min(-mobius[j], 1);
}
}
signed main()
{
ifstream fin ("pairs.in");
ofstream fout ("pairs.out");
// #define fin cin
// #define fout cout
int n; fin>>n;
ciur();
int cn=n;
while(cn--)
{
int x; fin>>x;
++fr[x];
}
int res=0;
for(int i=2; i<1000005; ++i)
{
// cout<<i<<' '<<mobius[i]<<'\n';
if(mobius[i] == 0) continue;
int cnt=0;
for(int j=i; j<1000005; j+=i)
cnt += fr[j];
res += cnt*(cnt-1)/2 * mobius[i];
}
fout<<n*(n-1)/2 - res;
return 0;
}