Pagini recente » Cod sursa (job #822529) | Cod sursa (job #255154) | Cod sursa (job #69993) | Cod sursa (job #3005617) | Cod sursa (job #911576)
Cod sursa(job #911576)
#include<stdio.h>
#define vmax 1001
#define nmax 501
#define ncmax 505
long d, j, i, n, nel, nr, t, k, ii, max;
long nd[vmax], v[vmax], a[nmax], p2m1[nmax][ncmax], rez[ncmax], unu[ncmax];
bool gr[vmax];
void suma(long c[ncmax], long a[ncmax], long b[ncmax])
{
max=a[0];
if(b[0]>max)
max=b[0];
t=0;
for (ii=1;ii<=max;ii++)
{
k=a[ii]+b[ii]+t;
c[ii]=k%10; t=k/10;
}
c[0]=max;
while (t>0)
{ c[++c[0]]=t; t=t/10; }
}
void diferenta(long c[ncmax], long a[ncmax], long b[ncmax])
{
t=0;
for (ii=1;ii<=a[0];ii++)
{
k=a[ii]-b[ii]+t; t=0;
if (k<0)
{ k+=10; t=-1;}
c[ii]=k;
}
while ((c[c[0]]==0)&&(c[0]>1))
c[0]--;
}
void ciur()
{
d=2;
while (d<=1000)
{
if (nd[d]==0)
{
nd[d]++;
for(j=2;d*j<=1000;j++)
{
nd[d*j]++;
if (j%d==0)
gr[d*j]=1;
}
}
d++;
}
for (i=2;i<=1000;i++)
if (!gr[i])
v[++nel]=i;
}
void rezolvare()
{
for (i=0;i<=p2m1[n][0];i++)
rez[i]=p2m1[n][i];
for (i=1;i<=nel;i++)
{
nr=0;
for (j=1;j<=n;j++)
if (a[j]%v[i]==0)
nr++;
if (nd[v[i]]%2==1)
diferenta(rez,rez,p2m1[nr]);
else
suma(rez,rez,p2m1[nr]);
}
}
int main()
{
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
ciur();
p2m1[0][0]=1; p2m1[0][1]=0; unu[0]=unu[1]=1;
scanf("%ld",&n);
for (i=1;i<=n;i++)
{
scanf("%ld",&a[i]);
suma(p2m1[i],p2m1[i-1],p2m1[i-1]); suma(p2m1[i],p2m1[i],unu);
}
rezolvare();
for (i=rez[0];i>=1;i--)
printf("%ld",rez[i]);
/* printf("%ld\n",nel);
for (i=1;i<=nel;i++)
printf("%ld %ld\n",v[i],nd[v[i]]);*/
return 0;
}