Cod sursa(job #5476)

Utilizator webspiderDumitru Bogdan webspider Data 12 ianuarie 2007 17:47:57
Problema Indep Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>

int primenb[95]={  2,     3,     5,     7,    11,    13,    17,    19,    23,    29, 
     	 	      31,    37,    41,    43,    47,    53,    59,    61,    67,    71, 
     			  73,    79,    83,    89,    97,   101,   103,   107,   109,   113, 
    		     127,   131,   137,   139,   149,   151,   157,   163,   167,   173, 
    		     179,   181,   191,   193,   197,   199,   211,   223,   227,   229, 
    		     233,   239,   241,   251,   257,   263,   269,   271,   277,   281, 
    		     283,   293,   307,   311,   313,   317,   331,   337,   347,   349, 
    		     353,   359,   367,   373,   379,   383,   389,   397,   401,   409,
    		     419,   421,   431,   433,   439,   443,   449,   457,   461,   463, 
    		     467,   479,   487,   491,   499 };

const int npr = 95;

int n;

int tzinede[96];
long long comb[500][500];

long long total;

int main()
{
	int a;
	int i,j;
	freopen("indep.in","r",stdin);
	freopen("indep.out","w",stdout);

	scanf("%d\n", &n);
	for ( i = 1; i <= n; i ++ )
	{
		scanf("%d\n", &a );
		for ( j = 0; j < npr; j++ )
			if ( a%primenb[j] == 0 ) tzinede[j]++;
	}

	comb[0][0]=1;
	for ( i = 1; i <= n; i++ )
		for ( j = 0 ; j <= i; j++ )
			comb[i][j] = comb[i-1][j] + comb[i-1][j-1];
	
	for ( i = 2; i <= n; i++ )
		total += comb[n][i];
	for ( i = 0; i < npr; i++ )
	{
		if ( tzinede[i] )
		{
			for ( j = 2; j <= tzinede[i]; j++ )
				total -= comb[ tzinede[i] ][j];
		}
	}

	printf("%Ld\n", total );

	fclose(stdin);
	fclose(stdout);

	return 0;
}