Advertisement
Guest User

Untitled

a guest
May 25th, 2019
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.74 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef double lf;
  6. typedef long double Lf;
  7. typedef pair <int,int> pii;
  8. typedef pair <ll, ll> pll;
  9.  
  10. #define TRACE(x) cerr << #x << "  " << x << endl
  11. #define FOR(i, a, b) for (int i = (a); i < int(b); i++)
  12. #define REP(i, n) FOR(i, 0, n)
  13. #define all(x) (x).begin(), (x).end()
  14. #define _ << " " <<
  15.  
  16. #define fi first
  17. #define sec second
  18. #define mp make_pair
  19. #define pb push_back
  20.  
  21. #define scan(x) do{Mi=1;while((x=getchar())<'0'){if (x=='-') Mi=-1;} for(x-='0'; '0'<=(L=getchar()); x=(x<<3)+(x<<1)+L-'0'); x*=Mi;}while(0)
  22. char L;
  23. int Mi;
  24.  
  25. const int MAXN = 32000;
  26. const int MAGIJA = 1002;
  27. const int MAXM = 1000000;
  28.  
  29. vector <int> imam[MAXM], input;
  30. int bitan[MAXM];
  31.  
  32. int ans[MAXN];
  33.  
  34.  
  35. inline void spremi(int x) {
  36.   int niz[10];
  37.   memset(niz, 0, sizeof niz);
  38.   int pomoc;
  39.   for(int i = 0; i < 10; i++) {
  40.     if(x) {
  41.       pomoc = x / 10;
  42.       niz[x - pomoc * 10]++, x = pomoc;
  43.     }
  44.     else
  45.       break;
  46.   }
  47.  
  48.   ll broj = 0;
  49.   REP(j, niz[9]) broj *= 10, broj += 9;
  50.   REP(j, niz[8]) broj *= 10, broj += 8;
  51.   REP(j, niz[7]) broj *= 10, broj += 7;
  52.   REP(j, niz[6]) broj *= 10, broj += 6;
  53.   REP(j, niz[5]) broj *= 10, broj += 5;
  54.   REP(j, niz[4]) broj *= 10, broj += 4;
  55.   REP(j, niz[3]) broj *= 10, broj += 3;
  56.   REP(j, niz[2]) broj *= 10, broj += 2;
  57.   REP(j, niz[1]) broj *= 10, broj += 1;
  58.   REP(j, niz[0]) broj *= 10;
  59.  
  60.   if (bitan[broj / MAGIJA]) imam[broj / MAGIJA].pb(broj);
  61. }
  62.  
  63. /// Set your CPU's L1 data cache size (in bytes) here
  64. const int64_t L1D_CACHE_SIZE = 32768;
  65.  
  66. /// Generate primes using the segmented sieve of Eratosthenes.
  67. /// This algorithm uses O(n log log n) operations and O(sqrt(n)) space.
  68. /// @param limit  Sieve primes <= limit.
  69. ///
  70. void segmented_sieve(int64_t limit)
  71. {
  72.   int64_t sqrt = (int64_t) std::sqrt(limit);
  73.   int64_t segment_size = std::max(sqrt, L1D_CACHE_SIZE);
  74.   //int64_t count = (limit < 2) ? 0 : 1;
  75.  
  76.   // we sieve primes >= 3
  77.   int64_t i = 3;
  78.   int64_t n = 3;
  79.   int64_t s = 3;
  80.  
  81.   std::vector<char> sieve(segment_size);
  82.   std::vector<char> is_prime(sqrt + 1, true);
  83.   std::vector<int64_t> primes;
  84.   std::vector<int64_t> multiples;
  85.  
  86.   for (int64_t low = 0; low <= limit; low += segment_size)
  87.   {
  88.     std::fill(sieve.begin(), sieve.end(), true);
  89.  
  90.     // current segment = [low, high]
  91.     int64_t high = low + segment_size - 1;
  92.     high = std::min(high, limit);
  93.  
  94.     // generate sieving primes using simple sieve of Eratosthenes
  95.     for (; i * i <= high; i += 2)
  96.       if (is_prime[i])
  97.         for (int64_t j = i * i; j <= sqrt; j += i)
  98.           is_prime[j] = false;
  99.  
  100.     // initialize sieving primes for segmented sieve
  101.     for (; s * s <= high; s += 2)
  102.     {
  103.       if (is_prime[s])
  104.       {
  105.            primes.push_back(s);
  106.         multiples.push_back(s * s - low);
  107.       }
  108.     }
  109.  
  110.     // sieve the current segment
  111.     for (std::size_t i = 0; i < primes.size(); i++)
  112.     {
  113.       int64_t j = multiples[i];
  114.       for (int64_t k = primes[i] * 2; j < segment_size; j += k)
  115.         sieve[j] = false;
  116.       multiples[i] = j - segment_size;
  117.     }
  118.  
  119.     for (; n <= high; n += 2)
  120.       if (sieve[n - low]) // n is a prime
  121.         spremi(n);
  122.   }
  123.  
  124. }
  125.  
  126.  
  127. void solve() {
  128.   int n, x;
  129.   vector <int> a;
  130.   scan(n);
  131.   int niz[10];
  132.   memset(niz, 0, sizeof niz);
  133.   REP(i, n) {
  134.     scan(x);
  135.     niz[x]++;
  136.   }
  137.   ll broj = 0;
  138.   for (int i = 9; i >= 0; i--) {
  139.     REP(j, niz[i]) {
  140.       broj *= 10;
  141.       broj += i;
  142.     }
  143.   }
  144.   input.pb(broj);
  145.   bitan[broj / MAGIJA] = 1;
  146. }
  147.  
  148.  
  149. int main() {
  150.   int t;
  151.   scan(t);
  152.   REP(i, t) solve();
  153.   segmented_sieve(1000000000);
  154.   spremi(2);
  155.   REP(i, t) {
  156.     int cnt = 0;
  157.     for (auto &x : imam[input[i] / MAGIJA]) cnt += (x == input[i]);
  158.     printf("%d\n",cnt);
  159.   }
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement