Pagini recente » Monitorul de evaluare | Cod sursa (job #2756976) | Cod sursa (job #1330291) | Cod sursa (job #1567373) | Cod sursa (job #1567369)
#include <cstdio>
#include <cstring>
using namespace std;
const int nmx = 1000002;
const int pmx = 80000;
int n,prim[pmx],MAX;
bool viz[nmx];
void ciur() {
prim[0] = 1;
prim[1] = 2;
for(int i = 3; i <= nmx; i += 2)
if(not viz[i]) {
prim[++prim[0]] = i;
for(int j = 2 * i; j <= nmx; j += i)
viz[j] = true;
}
}
void input() {
scanf("%d", &n);
memset(viz,0,sizeof(viz));
int nr;
for(int i = 1; i <= n; ++i) {
scanf("%d", &nr);
MAX = MAX < nr ? nr : MAX;
viz[nr] = true;
}
}
int descompunere(int nr) {
int total = 0;
for(int i = 1; prim[i] * prim[i] <= nr; ++i)
if(nr % prim[i] == 0) {
++ total;
nr /= prim[i];
if(nr % prim[i] == 0)
return -1;
}
if(nr > 1)
++ total;
return total;
}
void principiu() {
int t,pos,nrfac;
long long total = (n * (n-1)) / 2;
for(int i = 2; i <= MAX; ++i) {
nrfac = descompunere(i);
if(nrfac == -1)
continue;
t = 0;
pos = i;
while(pos <= MAX) {
if(viz[pos])
++ t;
pos += i;
}
if(nrfac % 2 == 1)
total -= (long long)(t * (t-1)) / 2;
else
total += (long long)(t * (t-1)) / 2;
}
printf("%d\n", total);
}
int main() {
freopen("pairs.in", "r", stdin);
freopen("pairs.out", "w", stdout);
ciur();
input();
principiu();
return 0;
}