Cod sursa(job #1034641)

Utilizator visanrVisan Radu visanr Data 17 noiembrie 2013 23:04:09
Problema Dtcsu Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <cstdio>
#include <cstdlib>
#include <bitset>
#include <cstring>
#include <algorithm>
#include <iomanip>
using namespace std;

const int Mod[5] = {666013, 1000003, 826663, 797593, 959473};

int T, Ans;
long long N;
bitset<1000010> Hash[5];

const int MaxB = 100000;
char Buf[MaxB];
int Ptr;

inline long long Get()
{
    long long Ans = 0;
    while(!isdigit(Buf[Ptr]))
        if(++ Ptr >= MaxB)
            fread(Buf, 1, MaxB, stdin), Ptr = 0;
    while(isdigit(Buf[Ptr]))
    {
        Ans = Ans * 10 + Buf[Ptr] - '0';
        if(++ Ptr >= MaxB)
            fread(Buf, 1, MaxB, stdin), Ptr = 0;
    }
    return Ans;
}

int main()
{
    freopen("dtcsu.in", "r", stdin);
    freopen("dtcsu.out", "w", stdout);
    fread(Buf, 1, MaxB, stdin);

    for(int i = 1; i <= 276997; ++ i)
    {
        long long X = Get();
        for(int j = 0; j < 5; ++ j)
            Hash[j][X % Mod[j]] = 1;
    }

    T = Get();
    for(; T; T --)
    {
        N = Get();
        bool OK = 1;
        for(int j = 0; j < 5 && OK; ++ j)
            if(Hash[j][N % Mod[j]] == 0)
                OK = 0;

        if(OK)
        {
            N /= (N & (-N));
            while(N % 15 == 0) N /= 15;
            while(N % 3 == 0) N /= 3;
            while(N % 5 == 0) N /= 5;
            while(N % 7 == 0) N /= 7;
            while(N % 11 == 0) N /= 11;
            if(N == 1) Ans ++;
        }
    }

    printf("%i\n", Ans);
}