Pagini recente » Cod sursa (job #307035) | Cod sursa (job #1575989) | Cod sursa (job #2701620) | Cod sursa (job #773484) | Cod sursa (job #380613)
Cod sursa(job #380613)
#include <stdio.h>
#define NMAX 501
#define PMAX 1001
int n,v[NMAX],div[NMAX],r;
int A[PMAX][NMAX],rez[PMAX],unu[2];
char c[PMAX],marc[PMAX];
void ciur()
{
int i,j;
for (i=2; i*i<=1000; i++)
if (c[i]==false)
for (j=i*i; j<=1000; j+=i)
c[j]=true;
for (i=2; i<=1000; i++)
if (!c[i])
{
div[++r]=i;
marc[i]=1;
}
}
void mul(int A[], int B)
{
int i, t = 0;
for (i = 1; i <= A[0] || t; i++, t /= 10)
A[i] = (t += A[i] * B) % 10;
A[0] = i - 1;
}
void sub(int A[], int B[])
{
int i, t = 0;
for (i = 1; i <= A[0]; i++)
A[i] += (t = (A[i] -= B[i] + t) < 0) * 10;
for (; A[0] > 1 && !A[A[0]]; A[0]--);
}
void add(int A[], int B[])
{
int i, t = 0;
for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)
A[i] = (t += A[i] + B[i]) % 10;
A[0] = i - 1;
}
void read()
{
scanf("%d",&n);
int i;
for (i=1; i<=n; i++)
scanf("%d",&v[i]);
}
void precompute()
{
int i,j;
A[0][0]=1; A[0][1]=1; unu[0]=1; unu[1]=1;
for (i=1; i<=1000; i++)
{
for (j=0; j<=A[i-1][0]; j++)
A[i][j]=A[i-1][j];
mul(A[i],2);
}
}
void update (int x,int y)
{
int i,nr=0;
for (i=1; i<=n; i++)
if (v[i]%x==0)
nr++;
if (y & 1)
{
add(rez,A[nr]);
sub(rez,unu);
}
else
{
sub(rez,A[nr]);
add(rez,unu);
}
}
void solve()
{
int i,j,x,nr;
char flag;
for (i=2; i<=1000; i++)
{
x=i; nr=0; flag=0;
for (j=1; j<=r; j++)
if (x%div[j]==0)
{
nr++;
while (x%div[j]==0)
{
x/=div[j];
if (x%div[j]==0)
flag=1;
}
}
if (!flag)
update (i,nr);
}
}
int main()
{
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
int i;
ciur();
precompute();
read();
add(rez,A[n]);
solve();
sub(rez,A[n]);
sub(A[n],rez);
sub(A[n],unu);
for (i=A[n][0]; i>=1; i--)
printf("%d",A[n][i]);
return 0;
}