Cod sursa(job #1689531)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 14 aprilie 2016 12:33:24
Problema Indep Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
#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;
}