Cod sursa(job #380616)

Utilizator indestructiblecont de teste indestructible Data 6 ianuarie 2010 22:22:29
Problema Indep Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#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)
	{
		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;
}