Pagini recente » Cod sursa (job #1357859) | Cod sursa (job #3000160) | Cod sursa (job #311492) | Cod sursa (job #1537363) | Cod sursa (job #2305305)
/* Generam toate numerele prime relevante pentru formarea celui mai mare numar din sir (am ales MAX / 2 ca ultim numar)
pentru fiecare posibil divizor (adica fiecare numar de la 2 la MAX) verificam din cate numere din sir face parte cel putin o data
cautam prin numerele de la 2 la MAX numerele care se formeaza din factori primi care apar o singura data si numaram acei factori
daca numarul de factori primi este impar, se aduna la solutie, daca e par, se scade (principiul includerii si excluderii)
*/
#include <stdio.h>
#include <stdlib.h>
using namespace std;
bool in_v[1000001];
int *genereaza_nr_prime(int n, int &nr_prime) {
nr_prime = 1;
bool prim;
int *p = (int*) calloc(n, sizeof(int));
p[0] = 2;
for (int i = 3; i * 2 <= n; i += 2) {
prim = 1;
for (int j = 0; j < nr_prime; j++)
if (i % p[j] == 0) {
prim = 0;
break;
}
if (prim) {
p[nr_prime] = i;
nr_prime++;
}
}
p = (int*) realloc(p, nr_prime * sizeof(int));
return p;
}
int *verifica_factori_in_n(int *p, int nr_p, int *v, int n, int MAX) {
int *x = (int*) calloc(MAX, sizeof(int)), nr;
for (int i = 2; i < MAX; i++) {
nr = i;
for (int j = 1; nr <= MAX; nr += i) // cautam prin toti multiplii numarului prim
if (in_v[nr])
x[i]++;
}
return x;
}
int descompune(int nr, int *p, int nr_p) {
int factori_distincti = 0;
for (int i = 0; i < nr_p; i++) {
if (nr == p[i]) // daca e prim are un singur factor
return 1;
if (nr % p[i] == 0)
if ((nr / p[i]) % p[i] == 0) // daca se imparte de mai mult de o data nu il vom folosi in calcul, deci returnam -1
return -1;
else
factori_distincti++;
}
return factori_distincti;
}
int main() {
freopen("pairs.in", "r", stdin);
freopen("pairs.out", "w", stdout);
int n, MAX, v[100000];
int *p, nr_p;
int *x, nr_fact;
long long sol = 0;
scanf("%d %d", &n, &v[0]);
MAX = v[0];
in_v[v[0]] = true;
for (int i = 1; i < n; i++) {
scanf("%d", &v[i]);
in_v[v[i]] = true;
if (v[i] > MAX)
MAX = v[i];
}
p = genereaza_nr_prime(MAX, nr_p);
/*x = verifica_factori_in_n(p, nr_p, v, n, MAX);
for (int i = 2; i * 2 <= MAX; i++) {
nr_fact = descompune(i, p, nr_p);
if (nr_fact > 0) {
if (nr_fact % 2 == 0)
sol -= (x[i] * (x[i] - 1) / 2);
else
sol += (x[i] * (x[i] - 1) / 2);
}
}*/
printf("%lld\n", sol);
return 0;
}