Pagini recente » Cod sursa (job #1688581) | Cod sursa (job #1262470) | Cod sursa (job #1080490) | Cod sursa (job #1927121) | Cod sursa (job #380620)
Cod sursa(job #380620)
#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];
int D[10][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 && nr==1)
return ;
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)
D[nr][++D[nr][0]]=i;
}
for (i=1; i<=10; i++)
for (j=1; j<=D[i][0]; j++)
update(D[i][j],i);
}
int main()
{
freopen("indep.in","r",stdin);
freopen("indep.out","w",stdout);
int i;
ciur();
precompute();
read();
solve();
sub(A[n],rez);
sub(A[n],unu);
for (i=A[n][0]; i>=1; i--)
printf("%d",A[n][i]);
return 0;
}