Pagini recente » Cod sursa (job #3188039) | Cod sursa (job #2530822) | Cod sursa (job #477807) | Cod sursa (job #1919107) | Cod sursa (job #2516965)
#include <bits/stdc++.h>
#define DIM 510
using namespace std;
ifstream fin("indep.in");
ofstream fout("indep.out");
int n,i,j,k,nr,fact,e,ok,v[DIM],doi[DIM],p[DIM][DIM],maxim,d,s1[DIM],s2[DIM];
struct {
int nr,fact;
} a[2*DIM];
void adunare(int A[],int B[],int C[]) {
int t=0;
C[0]=max(A[0],B[0]);
for (int i=1;i<=C[0];i++) {
C[i]=A[i]+B[i]+t;
t=C[i]/10;
C[i]%=10;
}
if (t)
C[++C[0]]=t;
}
void scadere(int A[],int B[]) {
int t=0;
for (int i=B[0]+1;i<=A[0];i++)
B[i]=0;
for (int i=1;i<=A[0];i++) {
A[i]-=B[i]+t;
if (A[i]<0)
t=1, A[i]+=10;
else
t=0;
}
while (!A[A[0]])
A[0]--;
}
int main() {
fin>>n;
for (i=1;i<=n;i++) {
fin>>v[i];
maxim=max(maxim,v[i]);
}
p[0][0]=1, p[0][1]=1;
for (i=1;i<=n;i++) {
adunare(p[i-1],p[i-1],p[i]);
p[i-1][1]--; //2^(i-1)-1
}
p[n][1]--;
for (i=2;i<=maxim;i++) {
nr=i, fact=0, d=2, ok=1;
while (nr!=1) {
e=0;
while (nr%d==0) {
nr/=d;
e++;
}
if (e==1)
fact++;
if (e>=2)
ok=0;
d++;
}
if (ok) {
a[++k].nr=i;
a[k].fact=fact;
}
}
for (i=1;i<=k;i++) {
nr=0;
for (j=1;j<=n;j++)
if (v[j]%a[i].nr==0)
nr++;
if (a[i].fact%2==1)
adunare(s1,p[nr],s1);
else
adunare(s2,p[nr],s2);
}
scadere(s1,s2);
scadere(p[n],s1);
if (p[n][0]<=0)
fout<<"0";
for (i=p[n][0];i>=1;i--)
fout<<p[n][i];
return 0;
}