Cod sursa(job #1164590)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 2 aprilie 2014 10:23:37
Problema Dtcsu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<fstream>
#include<bitset>

using namespace std;

#define nr_linii 276997

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

int fact[] = { 0 , 2 , 3 , 5 , 7 , 11 };
long long n , nr , aux;
char sir[100];
int sol;

bitset< 1<<22 >H1;
bitset< 1<<21 >H2;

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

int hash1( long long nr ){
    return (nr >> 24LL) & ((1 << 22) - 1);
}

int hash2( long long nr ){
    return (nr >> 3LL) & ((1<<21) - 1);
}

void read(){

    for( int i = 1 ; i <= nr_linii ; i++ ){
        get_nr( nr );
        H1[hash1(nr)] = true;
        H2[hash2(nr)] = true;
    }

}

bool verif( long long nr ){
    return H1[hash1(nr)] && H2[hash2(nr)];
}

int main(){

    read();

    get_nr( n );

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

        if( nr & (-nr) )
            nr /= (nr & (-nr));

        if( verif( nr ) ){
            for( int j = 1 ; j <= 5 ; j++ ){
                while( nr > 1 && (( aux = nr/fact[j] ) * fact[j] == nr) ){
                        nr = aux;
                }
            }
            if( nr == 1 ){
                sol++;
            }
        }
    }

    g<<sol<<"\n";

    return 0;
}