Pagini recente » Cod sursa (job #1866294) | Cod sursa (job #871130) | Cod sursa (job #2945728) | Cod sursa (job #2822567) | Cod sursa (job #2832202)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("pairs.in");
ofstream fout("pairs.out");
/// fr[i] = de cate ori apare i in sir
/// frm[i] = cate numere din sir sunt multiple de i
/// cnt[i] = cate perechi au cmmdc-ul egal cu un multiplu de i
/// rez = cnt[1] + SUM(k=2...1000000,mobius[k]*cnt[k])
int n;
int a[100005],ciur[1000005],fr[1000005],frm[1000005],mobius[1000005];
long long cnt[1000005],ans[1000005];
int main()
{
fin>>n;
for(int i=1; i<=n; i++)
fin>>a[i];
for(int i=1; i<=n; i++)
fr[a[i]]++;
for(int i=1; i<=1000000; i++)
mobius[i]=1;
for(int i=2; i<=1000000; i++)
{
if(ciur[i]==0)
{
for(int j=i; j<=1000000; j+=i)
{
mobius[j]*=-1;
if((j/i)%i==0)
mobius[j]=0;
ciur[j]=1;
}
}
}
for(int i=1; i<=1000000; i++)
{
if(mobius[i]==0)
continue;
int sum=0;
for(int j=i; j<=1000000; j+=i)
sum+=fr[j];
cnt[i]=1LL*sum*(sum-1)/2;
}
long long ans=cnt[1];
for(int i=2; i<=1000000; i++)
ans+=mobius[i]*cnt[i];
fout<<ans<<"\n";
return 0;
}