Pagini recente » Diferente pentru implica-te/arhiva-educationala intre reviziile 81 si 80 | Cod sursa (job #186032) | Cod sursa (job #141618) | Cod sursa (job #2961185) | Cod sursa (job #1120263)
#include<stdio.h>
#include<algorithm>
#define maxn 100005
#define maxval 1000005
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int used[maxval],nr[maxval],sieve[maxval];
long long sol;
void read()
{
int x;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&x),m=max(m,x),used[x]=1;
}
void solve()
{
sol=1LL*n*(n-1)/2;
for(int i=2;i<=m;i++)
for(long long j=i;j<=m;j+=i)
if(used[j]) nr[i]++;
for(int i=2;i<=m;i++)
if(!sieve[i])
{
sol-=1LL*nr[i]*(nr[i]-1)/2;
for(long long j=i;j<=m;j+=i) sieve[j]++;
for(long long j=1LL*i*i;j<=m;j+=1LL*i*i) sieve[j]=-inf;
}
else
if(sieve[i]>1)
{
if(sieve[i]%2==0) sol+=1LL*nr[i]*(nr[i]-1)/2;
else sol-=1LL*nr[i]*(nr[i]-1)/2;
}
}
int main()
{
freopen("pairs.in","r",stdin);
freopen("pairs.out","w",stdout);
read();
solve();
printf("%lld",sol);
fclose(stdin);
fclose(stdout);
return 0;
}