Pagini recente » Cod sursa (job #1080819) | Cod sursa (job #222609) | Cod sursa (job #1681942) | Cod sursa (job #1303390) | Cod sursa (job #2642244)
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int MAXCF = 350;
const int VMAX = 1000;
const int NMAX = 500;
const int BASE = 10000;
class Huge {
private:
int cf[MAXCF];
public:
Huge(int x = 0) {
for(int i = 0; i < MAXCF; i++)
cf[i] = 0;
if(x == 0)
cf[0] = 1, cf[1] = 0;
else {
cf[0] = 0;
while(x) {
cf[++cf[0]] = x % BASE;
x /= BASE;
}
}
}
void fill0(int dim) {
for(int i = cf[0] + 1; i <= dim; i++)
cf[i] = 0;
}
Huge operator = (Huge dr) {
for(int i = 0; i <= dr.cf[0]; i++)
cf[i] = dr.cf[i];
}
Huge operator += (Huge &dr) {
dr.fill0(max(dr.cf[0], cf[0]));
fill0(max(dr.cf[0], cf[0]));
cf[0] = max(dr.cf[0], cf[0]);
int r = 0;
for(int i = 1; i <= cf[0]; i++) {
cf[i] += dr.cf[i] + r;
r = cf[i] / BASE;
cf[i] %= BASE;
}
if(r) cf[++cf[0]] = r;
return *this;
}
Huge operator -= (Huge dr) {
dr.fill0(cf[0]);
for(int i = 1, r = 0; i <= cf[0]; i++) {
cf[i] -= dr.cf[i] + r;
if(cf[i] < 0)
cf[i] += BASE, r = 1;
else
r = 0;
}
while(cf[0] > 1 && cf[cf[0]] == 0)
cf[0]--;
return *this;
}
void print() {
for(int i = cf[0]; i >= 1; i--) {
const char* format = (i < cf[0]) ? "%04d" : "%d";
printf(format, cf[i]);
}
}
};
int frecv[VMAX + 5], nr_multipli[VMAX + 5];
int verif[VMAX + 5], nr_div[VMAX + 5];
Huge p2[NMAX + 5];
void precalc() {
for(int i = 1; i <= VMAX; i++)
verif[i] = 1;
for(int i = 2; i <= VMAX; i++)
if(verif[i] == 1)
for(int j = i; j <= VMAX; j += i) {
verif[j] *= i;
nr_div[j]++;
}
}
int main() {
freopen("indep.in", "r", stdin);
freopen("indep.out", "w", stdout);
int n, x, maxim = 0;
precalc();
scanf("%d", &n);
p2[0] = Huge(1);
for(int i = 1; i <= n; i++) {
p2[i] = p2[i - 1];
p2[i] += p2[i - 1];
scanf("%d", &x);
frecv[x]++;
maxim = max(maxim, x);
}
for(int i = 1; i <= n; i++)
p2[i] -= Huge(1);
for(int i = 2; i <= maxim; i++)
for(int j = i; j <= maxim; j += i)
nr_multipli[i] += frecv[j];
Huge sol = p2[n];
for(int i = 2; i <= maxim; i++)
if(verif[i] == i && nr_multipli[i] != 0)
if(nr_div[i] % 2 == 0)
sol += p2[nr_multipli[i]];
else
sol -= p2[nr_multipli[i]];
sol.print();
return 0;
}