Pagini recente » Cod sursa (job #1842243) | Cod sursa (job #535010) | Cod sursa (job #2316017) | Cod sursa (job #1190004) | Cod sursa (job #120298)
Cod sursa(job #120298)
#include <cstdio>
const int maxn = 1000001;
const int maxp = 2000;
FILE *in = fopen("pairs.in","r"), *out = fopen("pairs.out","w");
int n;
int k;
int w[maxn]; // w[i] = 1 daca i se aduna
// = 2 daca i se scade
// = -1 daca i nu e bun
int x[maxn]; // x[i] = 0 daca i e prim, 1 altfel
int maxnr = -1;
void ciur()
{
int end = 0;
for ( int i = 2; i <= maxnr; ++i )
if ( !x[i] )
{
for ( int j = i; j <= maxnr; j += i )
{
++w[j], x[j] = 1;
if ( w[j] == 3 )
w[j] = 1;
}
if ( !end )
{
if ( i*i <= maxnr )
w[i*i] = -1;
else
end = 1;
}
}
else
{
for ( int j = i+i; j <= maxnr; j += i )
w[j] = -1;
}
}
int e[maxn];
int h[maxn];
void read()
{
fscanf(in, "%d", &n);
int x = 0;
for ( int i = 1; i <= n; ++i )
fscanf(in, "%d", &x), ++e[ x ], x > maxnr ? maxnr = x : 1;
}
void calch()
{
for ( int i = 1; i <= maxnr; ++i )
for ( int j = i; j <= maxnr; j += i )
if ( e[j] )
++h[i];
}
long long count()
{
long long res = 0;
for ( int i = 2; i <= maxnr; ++i )
if ( w[i] == 1 )
res = res + (h[i]*(h[i]-1)/2);
else if ( w[i] == 2 )
res = res - (h[i]*(h[i]-1)/2);
return res;
}
int main()
{
read();
calch();
ciur();
long long cnt = (long long)n*(n-1)/2;
fprintf(out, "%lld\n", cnt - count());
return 0;
}