Cod sursa(job #2208051)

Utilizator RobybrasovRobert Hangu Robybrasov Data 27 mai 2018 23:37:29
Problema Dtcsu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <bits/stdc++.h>

#define SMAX 65536
#define N 276997
#define BMAX 30571351

using namespace std;

constexpr const uint8_t D[4] = {3, 5, 7, 11};

char s[SMAX];
int p;
FILE *f;
bitset<BMAX> H;

void read(uint64_t &x) {
    x = 0;
    for (; s[p] >= '0' && s[p] <= '9'; ++p) {
        x = 10 * x + s[p] - '0';
        if (p == SMAX - 1) {
            fread(s, 1, SMAX, f);
            p = -1;
        }
    }
    for (; s[p] < '0' || s[p] > '9'; ++p) {
        if (p == SMAX - 1) {
            fread(s, 1, SMAX, f);
            p = -1;
        }
    }
}

inline void insert(uint64_t x) {
    uint32_t l = x;
    uint32_t t = x >> 8;
    uint32_t v = x >> 24;
    uint32_t m = x >> 16;
    uint32_t u = x >> 32;
    H[u % BMAX] = 1;
    H[l % BMAX] = 1;
    H[m % BMAX] = 1;
    H[t % BMAX] = 1;
    H[v % BMAX] = 1;
}

inline bool contains(uint64_t x) {
    uint32_t l = x;
    uint32_t t = x >> 8;
    uint32_t v = x >> 24;
    uint32_t m = x >> 16;
    uint32_t u = x >> 32;
    return H[u % BMAX] == 1 && H[l % BMAX] == 1 && H[m % BMAX] == 1 &&
           H[t % BMAX] == 1 && H[v % BMAX] == 1;
}

inline bool isTrulyMember(uint64_t x) {
    if (x > 0) {
        x = x / (x & -x);
        for (int i = 0; i < 4 && x > 1; ++i) {
            for (; x > 1 && x % D[i] == 0; x /= D[i]);
        }
    }
    return x == 1;
}

int main() {
    f = fopen("dtcsu.in", "r");
    FILE* g = fopen("dtcsu.out","w");

    fread(s, 1, SMAX, f);
    p = 0;

    for (int i = 0; i < N; ++i) {
        uint64_t x;
        read(x);
        insert(x);
    }
    uint64_t n;
    read(n);
    int k = 0;
    while (n--) {
        uint64_t x;
        read(x);
        if (contains(x) && isTrulyMember(x)) {
            ++k;
        }
    }
    fprintf(g, "%d\n", k);

    return 0;
}