Pagini recente » Cod sursa (job #1588129) | Cod sursa (job #432058) | Cod sursa (job #2877427) | Cod sursa (job #2538040) | Cod sursa (job #213026)
Cod sursa(job #213026)
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <math.h>
#include <algorithm>
#include <utility>
#include <string>
#include <functional>
#include <sstream>
#include <fstream>
#include <iostream>
using namespace std;
#define FOR(i,a,b) for (i=a;i<=b;i++)
#define fori(it,v) for (it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define mp make_pair
#define fs first
#define ss second
#define all(c) c.begin(),c.end()
#define pf push_front
#define popb pop_back
#define popf pop_front
int c[1000005],a[1000005];
vector<bool> p(1000005);
void ciur_patrate(int n)
{
double aux=sqrt(n);
int i,j;
FOR(i,2,n)
if (c[i]==0)
{
for (j=i;j<=n;j+=i)
if (c[j]!=-1)
c[j]++;
if (i<=aux)
for (j=i*i;j<=n;j+=i*i)
{
c[j]=-1;
}
}
}
void ciur2(int n)
{
int i,j;
for (i=2;i<=n;i++)
if (c[i]!=-1)
for (j=i;j<=n;j+=i)
{
// printf("%d\n",j);
if (p[j])
a[i]++;
}
}
long long rez(int n)
{
long long val=(long long)n*(long long)(n-1)/2;
int i;
//printf("%lld\n",val);
FOR(i,2,1000000)
if (a[i]>1)
{
if (c[i]%2)
val-=(long long)a[i]*(long long)(a[i]-1)/(long long)2;
else
val+=(long long)a[i]*(long long)(a[i]-1)/(long long)2;
// printf("%lld\n",val);
}
return val;
}
int main()
{
FILE *in,*out;
int i,n,x;
in=fopen("pairs.in","r");
out=fopen("pairs.out","w");
fscanf(in,"%d",&n);
FOR(i,1,n)
{
fscanf(in,"%d",&x);
p[x]=1;
}
ciur_patrate(1000000);
ciur2(1000000);
//for (i=1;i<=30;i++)
// printf("c[%d]=%d\n",i,c[i]);
//for (i=1;i<=20;i++)
// printf("a[%d]=%d\n",i,a[i]);
fprintf(out,"%lld",rez(n));
fclose(in);
fclose(out);
return 0;
}