Cod sursa(job #1427581)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 2 mai 2015 16:34:46
Problema Dtcsu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#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;
}