Pagini recente » Cod sursa (job #751647) | Cod sursa (job #1095197) | Cod sursa (job #2541115) | Cod sursa (job #2773960) | Cod sursa (job #478443)
Cod sursa(job #478443)
#include <stdio.h>
#include <string.h>
#define Nmax 502
#define Vmax 1002
#define Cmax 305
#define B 10000
int p2[Nmax][Cmax],rez[Cmax];
int a[Nmax],p[Vmax],prim[Nmax];
int n;
inline int Maxim(int x,int y){ return x>y ? x:y; }
void adun(int a[],int b[]){
int i,t=0;
for(i=1; i<=a[0] || i<=b[0] || t; ++i,t/=B)
a[i]=(t+=a[i]+b[i])%B;
a[0]=i-1;
}
void scad(int a[],int b[]){
int i,t=0;
for(i=1; i<=a[0]; ++i){
a[i]=a[i]-b[i]-t;
if( a[i]<0 ) a[i]+=B, t=1;
else t=0;
}
while( !a[a[0]] ) --a[0];
}
void mul(int a[],int b){
int i,t=0;
for(i=1; i<=a[0] || t; ++i,t/=B)
a[i]=(t+=a[i]*b)%B;
a[0]=i-1;
}
int main(){
int i,j,nr,fp,mx=0,ok,z=0;
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;++i) scanf("%d",&a[i]),mx=Maxim(a[i],mx);
for(i=2;i<=1000;++i)
if(!p[i]){
prim[++z]=i;
for(j=i*2;j<=1000;j+=i)
p[j]++;
}
p2[0][0]=p2[0][1]=1;
for(i=1;i<=n;++i){
memcpy(p2[i],p2[i-1],sizeof(p2[i-1]));
mul(p2[i],2);
}
for(i=1;i<=n;++i) scad(p2[i],p2[0]);
p2[0][0]=p2[0][1]=0;
memcpy(rez,p2[n],sizeof(p2[n]));
for(i=2;i<=mx;++i){
for(j=1,fp=0,ok=1;j<=z && prim[j]<=i && ok;++j)
if( i % prim[j] ==0 ){
++fp;
if( (i/prim[j])%prim[j] == 0 ) ok=0;
}
if( ! ok ) continue;
for(nr=0,j=1;j<=n;++j)
if( a[j] % i == 0 ) nr++;
if( nr == 0 ) continue;
if( fp & 1 ) scad(rez,p2[nr]);
else adun(rez,p2[nr]);
}
printf("%d",rez[rez[0]]);
for(i=rez[0]-1; i>=1; --i) printf("%04d",rez[i]);
fclose(stdin); fclose(stdout);
return 0;
}