Pagini recente » git_gud_score_at_oji_1 | Monitorul de evaluare | Monitorul de evaluare | Rating Bogdal Netkowski (marty3575) | Cod sursa (job #1689531)
#include <bits/stdc++.h>
const int DIM = 1 << 9;
using namespace std;
int V[DIM], Pr[DIM], Cnt[DIM << 2], nr, N;
int Pow[DIM][DIM], Ans[DIM], K;
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;
return;
}
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;
return;
}
void sub( int A[], int B[] ) {
int i, t = 0;
for( i = 1; i <= A[0]; i ++ ) {
A[i] -= ( (i <= B[0]) ? B[i] : 0 ) + t;
A[i] += ( t = A[i] < 0 ) * 10;
}
while( A[0] > 1 && !A[ A[0] ] )
A[0] --;
return;
}
void back_track( int pos, int prod, int cnt ) {
if( cnt != 0 ) {
int nr = 0;
for( int i = 1; i <= N; i ++ ) {
if( V[i] % prod == 0 )
nr ++;
}
switch( cnt % 2 ) {
case 0: { add( Ans, Pow[nr] ); break; }
case 1: { sub( Ans, Pow[nr] ); break; }
}
}
for( int i = pos + 1; i <= K; i ++ ) {
if( prod * Pr[i] <= 1000 )
back_track( i, prod * Pr[i], cnt + 1 );
}
return;
}
int main() {
FILE *input_file = fopen( "indep.in" , "r" );
FILE *output_file = fopen( "indep.out", "w" );
fscanf( input_file, "%d", &N );
for( int i = 1; i <= N; i ++ )
fscanf( input_file, "%d", &V[i] );
Pow[0][0] = Pow[0][1] = 1;
for( int i = 1; i <= N; i ++ ) {
add( Pow[i], Pow[i - 1] );
mul( Pow[i], 2 );
}
for( int i = 1; i <= N; i ++ )
sub( Pow[i], Pow[0] );
Pow[0][0] = Pow[0][1] = 0;
add( Ans, Pow[N] );
for( int i = 2; i <= 1000; i ++ ) {
if( Cnt[i] == 0 ) {
Pr[++K] = i;
for( int j = i + i; j <= 1000; j += i )
Cnt[j] ++;
}
}
back_track( 0, 1, 0 );
for( int i = Ans[0]; i >= 1; i -- )
fprintf( output_file, "%d", Ans[i] );
return 0;
}