Cod sursa(job #2402473)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 10 aprilie 2019 18:54:49
Problema Divizori Primi Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <bits/stdc++.h>

const int MV = 100005 ;

FILE *in = fopen("divprim.in", "r"), *out = fopen("divprim.out", "w") ;

std::vector<int> prime[11] ;

int sieve[MV] ;

void ciur() {
  int i, j ;
  for (i = 2; i <= MV ; i += 2) {
    sieve[i] = 1 ;
  }
  for (i = 3 ; i <= MV ; i += 2) {
    if (!sieve[i]) {
      for (j = i ; j <= MV ; j += i) {
        sieve[j] ++ ;
      }
    }
  }
}

void comp() {
  int i ;
  for (i = 1 ; i <= MV ; ++ i) {
    prime[sieve[i]].push_back(i) ;
  }
}

int caut_bin(int limit, int nrdiv) {
  int pas, pos(0) ;
  for (pas = 1 << 20 ; pas ; pas >>= 1) {
    if (pas + pos < prime[nrdiv].size() && prime[nrdiv][pas + pos] <= limit)
      pos |= pas ;
  }
  return prime[nrdiv][pos] ;
}

int solve() {
  int n, k ;
  fscanf(in, "%d %d", &n, &k) ;
  int ans = caut_bin(n, k) ;
  return ans * (ans <= n) ;
}

int main() {
  ciur() ;
  comp() ;
  int querrys ;
  fscanf(in, "%d", &querrys) ;
  while (querrys --) {
    fprintf(out, "%d\n" ,solve()) ;
  }
}