Pagini recente » Cod sursa (job #3363696) | Cod sursa (job #3363967) | Cod sursa (job #3361898) | Cod sursa (job #3363926) | Cod sursa (job #3363924)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
typedef int Huge[203];
const int DIM = 1000;
Huge p2[503], unu;
int n, frqVal[DIM + 3];
int ciur1[DIM + 3]; ///ciur1[x] = nr de factori primi dif ai lu x
bool ciur2[DIM + 3]; ///ciur2[x] = daca are vreun factor prim la o put >= 2
int frq[DIM + 3]; ///frq[x] = nr de v[i] uri div cu x
inline void atrib(Huge &x, Huge &y) {
//x = y
for(int i=y[0]+1; i<=x[0]; i++) x[i] = 0;
for(int i=0; i<=y[0]; i++) x[i] = y[i];
}
inline void adunare(Huge &x, Huge &y) {
//x += y
if(x[0] < y[0]) x[0] = y[0];
int t = 0;
for(int i=1; i<=x[0]; i++, t/=10) {
t += x[i] + y[i];
x[i] = t % 10;
}
if(t) x[++x[0]] = t;
}
inline void scadere(Huge &x, Huge &y) {
//x -= y
for(int i=1; i<=x[0]; i++) {
if(x[i] >= y[i]) x[i] -= y[i];
else {
int j = i + 1;
while(x[j] == 0) x[j++] = 9;
x[j]--;
x[i] = 10 + x[i] - y[i];
}
}
while(x[x[0]] == 0 && x[0] > 0) x[0]--;
}
inline void produsMIC(Huge &x, int n) {
int t = 0;
for(int i=1; i<=x[0]; i++, t/=10) {
t += x[i] * n;
x[i] = t % 10;
}
while(t) x[++x[0]] = t % 10, t /= 10;
}
inline void prelucru() {
p2[0][++p2[0][0]] = 1; ///2^0 = 1
unu[++unu[0]] = 1;
for(int i=1; i<=500; i++) {
atrib(p2[i], p2[i - 1]);
produsMIC(p2[i], 2);
}
for(int i=2; i<=DIM; i++) {
if(ciur1[i] == 0) { //prim
for(int j=i; j<=DIM; j+=i) ciur1[j]++;
for(int j=i*i; j<=DIM; j+=i*i) ciur2[j] = 1;
}
}
for(int i=2; i<=DIM; i++) {
if(ciur2[i] == 0) {
for(int j=i; j<=DIM; j+=i) frq[i] += frqVal[j];
}
}
}
int main()
{
fin >> n;
for(int i=1; i<=n; i++) {
int x; fin >> x;
frqVal[x]++;
}
prelucru();
Huge rez;
atrib(rez, p2[n]);
scadere(rez, unu);
for(int i=2; i<=DIM; i++) {
if(ciur2[i] == 0) {
if(ciur1[i] % 2 == 1) {
///-(2^frq - 1) = -2^frq + 1
scadere(rez, p2[frq[i]]);
adunare(rez, unu);
}
else {
///+(2^frq - 1)
adunare(rez, p2[frq[i]]);
scadere(rez, unu);
}
}
}
for(int i=rez[0]; i>=1; i--) fout << rez[i];
return 0;
}