Pagini recente » Cod sursa (job #2753753) | Cod sursa (job #193301) | Borderou de evaluare (job #2888897) | Cod sursa (job #702004) | Cod sursa (job #1427581)
#include <stdio.h>
#include <ctype.h>
#define SIGMA 276997
#define BITS 22
#define MASK ((1 << BITS) - 1)
#define BUFF_SIZE 4096
typedef unsigned long long uLL;
char bloomFilter[(1 << BITS) >> 3]; // avem nevoie doar de biti, iar char are 8 biti
char buff[BUFF_SIZE];
int pos = BUFF_SIZE;
FILE *f;
inline char get() {
if (pos == BUFF_SIZE) {
fread(buff, 1, BUFF_SIZE, f);
pos = 0;
}
return buff[pos++];
}
template <class T>
void readNumber(T *nr) {
char c;
do {
c = get();
} while (!isdigit(c));
*nr = 0;
do {
*nr = (*nr << 1) + (*nr << 3) + (c - '0');
c = get();
} while (isdigit(c));
}
int main(void) {
int nTests, cnt;
uLL a;
f = fopen("dtcsu.in", "r");
for (int i = 0; i < SIGMA; i++) {
readNumber(&a);
bloomFilter[(a & MASK) >> 3] |= (1 << ((a & MASK) & 7));
}
readNumber(&nTests);
cnt = 0;
for (; nTests; nTests--) {
readNumber(&a);
if (a && (bloomFilter[(a & MASK) >> 3] & (1 << ((a & MASK) & 7)))) { // are sanse sa fie bun
a = (a / (a & -a)); // anulare factori 2
uLL t;
while (((t = a / 3) << 1) + t == a) { // factori de 3
a = t;
}
while (((t = a / 5) << 2) + t == a) {
a = t;
}
while ((((t = a / 7)) << 2) + (t << 1) + t == a) {
a = t;
}
while (((t = a / 11) << 3) + (t << 1) + t == a) {
a = t;
}
cnt = cnt + (a == 1);
}
}
fclose(f);
f = fopen("dtcsu.out", "w");
fprintf(f, "%d\n", cnt);
fclose(f);
return 0;
}