Cod sursa(job #1164554)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 2 aprilie 2014 09:55:08
Problema Dtcsu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<fstream>
#include<bitset>

using namespace std;

#define nr_hash 7
#define nr_linii 276997
#define max_mod 1017329

FILE*f = fopen("dtcsu.in" , "r");
ofstream g("dtcsu.out");

int fact[] = { 0 , 2 , 3 , 5 , 7 , 11 };
int P[] = { 1002493 , 1017329 , 644101 ,  982099  , 1000003 , 985121 ,  975643 };
long long n , nr;
char sir[100];
int sol;
bool ok;

bitset<max_mod>H[nr_hash];

long long get_nr(){
    fgets( sir , 100 , f );
    long long nr = 0;
    int k = 0;
    while( sir[k] >= '0' && sir[k] <= '9' ){
        nr = nr*10 + sir[k] - '0';
    }
    return nr;
}

void hash1( long long nr ){

    for( int i = 0 ; i < nr_hash ; i++ ){
        H[i][ nr % P[i] ] = 1;
    }

}

void read(){

    for( int i = 1 ; i <= nr_linii ; i++ ){
        hash1( get_nr() );
    }

}

bool verif( long long nr ){

    for( int i = 0 ; i < nr_hash ; i++ )
        if( H[i][ nr % P[i] ] == 0 )
            return 0;

    return 1;
}

int main(){

    read();

    n = get_nr();

    for( int i = 1 ; i <= n ; i++ ){
        nr = get_nr();

        ok = verif( nr );

        if( ok ){
            for( int j = 1 ; j <= 5 ; j++ ){
                while( nr % fact[j] == 0 ){
                        nr /= fact[j];
                }
            }
            if( nr == 1 ){
                sol++;
            }
        }
    }

    g<<sol<<"\n";

    return 0;
}