Advertisement
Guest User

Untitled

a guest
Jun 24th, 2016
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <map>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <cstring>
  7. #include <cstdlib>
  8. #include <stdint.h>
  9. #include <bitset>
  10.  
  11. using namespace std;
  12.  
  13. const int UPPER_LIMIT = 1000000;
  14.  
  15. std::vector<int> primes;
  16.  
  17. void genPrimes(int max){
  18.    
  19.     char *sieve;
  20.     sieve = new char[max/2+1];
  21.     // Fill sieve with 1  
  22.     memset(sieve, 0xFF, (max/2+1) * sizeof(char));
  23.     for(int x = 2; x <= max; x++)
  24.         if(sieve[x/8] & (0x01 << (x % 8))){
  25.             primes.push_back(x);
  26.             // Is prime. Mark multiplicates.
  27.             for(int j = 2*x; j <= max; j += x)
  28.                 sieve[j/8] &= ~(0x01 << (j % 8));
  29.         }
  30.     delete[] sieve;
  31. }
  32.  
  33. int main() {
  34.  
  35.     primes.reserve(UPPER_LIMIT + 1);
  36.     genPrimes(UPPER_LIMIT + 1);
  37.  
  38.     int t;
  39.     cin >> t;
  40.  
  41.     while (t--) {
  42.         int n;
  43.         cin >> n;
  44.  
  45.         bitset<UPPER_LIMIT + 1> table;
  46.  
  47.         int maxPrime = 0;
  48.  
  49.         while (n--) {
  50.             int tmp;
  51.             cin >> tmp;
  52.  
  53.             if (binary_search(primes.begin(), primes.end(), tmp)) {
  54.                 table[1 + distance(primes.begin(), lower_bound(primes.begin(), primes.end(), tmp))] = true;
  55.                 // cout << "p = " << 1 + distance(primes.begin(), lower_bound(primes.begin(), primes.end(), tmp)) << '\n';
  56.                 maxPrime = max(maxPrime, tmp);
  57.             }
  58.             else
  59.             if (tmp == 1) {
  60.                 table[0] = true;
  61.             }
  62.         }
  63.  
  64.         // testa se a sequencia 1, 2, 3, 5, 7, ..., maxPrime foi lida
  65.         int pos = maxPrime > 0 ? 1 + distance(primes.begin(), lower_bound(primes.begin(), primes.end(), maxPrime)) : 0;
  66.         bool flag = true;
  67.         while (pos >= 0) flag &= table[pos--];
  68.  
  69.         cout << (flag ? (*upper_bound(primes.begin(), primes.end(), maxPrime) - 1) : 0) << '\n';
  70.     }
  71.  
  72.     return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement