Pagini recente » Cod sursa (job #752352) | Cod sursa (job #271259) | Cod sursa (job #1811156) | Cod sursa (job #2063786) | Cod sursa (job #2515078)
#include <fstream>
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
int n,i,j,v[505],p2[505][505],w[1005],fact[1005];
int unu[10],sol[505];
void adun(int A[], int B[], int C[])
{
int t = 0;
for (int i=1; i<=max(A[0], B[0]); i++)
{
C[i] = A[i]+B[i]+t;
t = C[i]/10;
C[i] %= 10;
}
C[0] = max(A[0], B[0]);
if (t)
C[++C[0]] = t;
}
void inmult(int A[], int b, int C[])
{
int t = 0;
for (int i=1; i<=A[0]; i++)
{
C[i] = A[i]*b+t;
t = C[i]/10;
C[i] %= 10;
}
C[0] = A[0];
while (t)
{
C[++C[0]] = t%10;
t /= 10;
}
}
void scad(int A[], int B[], int C[])
{
int t = 0;
for (int i=B[0]+1; i<=A[0]; i++)
B[i] = 0;
for (int i=1; i<=A[0]; i++)
{
C[i] = A[i]-B[i]-t;
if (C[i] < 0)
t = 1;
else
t = 0;
if (t)
C[i] += 10;
}
C[0] = A[0];
while (!C[C[0]] && C[0] > 0)
C[0]--;
}
int main()
{
fin >> n; int maxim = 0;
for (i=1; i<=n; i++)
{
fin >> v[i];
maxim = max(maxim, v[i]);
}
p2[0][0] = p2[0][1] = 1; int k = 0;
for (i=1; i<=n; i++)
inmult(p2[i-1], 2, p2[i]);
unu[0] = 1; unu[1] = 1;
for (i=0; i<=n; i++)
scad(p2[i], unu, p2[i]);
for (i=2; i<=maxim; i++)
{
int val = i; int ok = 0; int nrfact = 0;
for (int d=2; d*d<=val; d++)
if (val%d == 0)
{
int exponent = 0;
while (val%d == 0)
{
exponent++;
val /= d;
}
if (exponent >= 2)
{
ok = 1;
break;
}
nrfact++;
}
if (val != 1)
nrfact++;
if (ok == 0)
{
w[++k] = i;
fact[k] = nrfact;
}
}
for (i=0; i<=p2[n][0]; i++)
sol[i] = p2[n][i];
for (i=1; i<=k; i++)
{
int nr = 0;
for (j=1; j<=n; j++)
if (v[j]%w[i] == 0)
nr++;
if (fact[i]%2 == 1)
scad(sol, p2[nr], sol);
else
adun(sol, p2[nr], sol);
}
for (i=sol[0]; i>=1; i--)
fout << sol[i];
return 0;
}