Cod sursa(job #1046409)

Utilizator danalex97Dan H Alexandru danalex97 Data 2 decembrie 2013 21:38:41
Problema Dtcsu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <fstream>
#include <cstdio>
#include <bitset>
using namespace std;

ofstream G("dtcsu.out");

const int f_size = 1000010;
const int mod[] = { 666013, 1000003 , 826663 , 797593 , 959473 };
const int val[] = { 15 , 3 , 5 , 7 , 11 };

bitset<f_size> filter[5];

void insert(long long x)
{
    for (int i=0;i<5;++i)
        filter[i][ x%mod[i] ] = 1;
}

int find(long long x)
{
    for (int i=0;i<5;++i)
        if ( filter[i][ x%mod[i] ] == 0 )
            return 0;
    return 1;
}

const int N = 276997;
int Q,out;

const int Buffer=100000;
char Buff[Buffer]; int Next=0;

#define F stdin

long long get()
{
    long long Nbr=0;
    while( Buff[Next]<'0' || '9'<Buff[Next] )
        if ( ++Next >= Buffer ) fread(Buff,Buffer,1,F), Next=0;
    while ( '0'<=Buff[Next] && Buff[Next]<='9' )
    {
        Nbr=Nbr*10+Buff[Next]-'0';
        if ( ++Next >= Buffer ) fread(Buff,Buffer,1,F), Next=0;
    }
    return Nbr;
}

int main()
{
    freopen("dtcsu.in","r",stdin);
    for (int i=1;i<=N;++i)
    {
        long long X = get();
        for (int i=0;i<5;++i)
            filter[i][ X%mod[i] ] = 1;
    }
    Q = get();
    for (int i=1;i<=Q;++i)
    {
        long long X = get();
        bool ok = 1;
        for (int i=0;i<5 && ok;++i)
            if ( filter[i][ X%mod[i] ] == 0 )
                ok = 0;
        if ( ok )
        {
            X /= (X&(-X));
            for ( ; (X/15)*15 == X ; X /= 15 );
            for ( ; (X/3)*3 == X ; X /= 3 );
            for ( ; (X/5)*5 == X ; X /= 5 );
            for ( ; (X/7)*7 == X ; X /= 7 );
            for ( ; (X/11)*11 == X ; X /= 11 );
            if ( X == 1 ) ++out;
        }
    }
    G<<out<<'\n';
}