Pagini recente » Cod sursa (job #2369737) | Cod sursa (job #1329456) | Cod sursa (job #1186384) | Cod sursa (job #1874745) | Cod sursa (job #2832206)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("pairs.in");
ofstream fout("pairs.out");
/// fr[i] = de cate ori apare i in sir
/// cnt[i] = cate perechi au cmmdc-ul egal cu un multiplu de i
/// rez = cnt[1] + SUM(k=2...1000000,mobius[k]*cnt[k])
const int m=1000000;
int n;
int mobius[m+5];
long long cnt[m+5],ans;
bitset <m+5> ciur,fr;
int main()
{
fin>>n;
for(int i=1; i<=n; i++)
{
int x;
fin>>x;
fr[x]=1;
}
for(int i=1; i<=m; i++)
mobius[i]=1;
for(int i=2; i<=m; i++)
{
if(ciur[i]==0)
{
for(int j=i; j<=m; j+=i)
{
mobius[j]*=-1;
if((j/i)%i==0)
mobius[j]=0;
ciur[j]=1;
}
}
}
for(int i=1; i<=m; i++)
{
if(mobius[i]==0)
continue;
int sum=0;
for(int j=i; j<=m; j+=i)
sum+=fr[j];
cnt[i]=1LL*sum*(sum-1)/2;
}
long long ans=cnt[1];
for(int i=2; i<=m; i++)
ans+=mobius[i]*cnt[i];
fout<<ans<<"\n";
return 0;
}