Advertisement
Guest User

C++ CODE

a guest
Apr 30th, 2023
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. vector<int> find_primes(int l) {
  6.     vector<int> primes;
  7.     vector<int> numbers (l, 1);
  8.  
  9.     numbers[0] = 0;
  10.     numbers[1] = 0;
  11.  
  12.     for (int i = 2; i < l+1; ++i) {
  13.         if (numbers[i] == 0) {
  14.             continue;
  15.         }
  16.         primes.push_back(i);
  17.        
  18.         for (int j = 2 * i; j < l+1; j += i) {
  19.             numbers[j] = 0;
  20.         }
  21.     }
  22.  
  23.     return primes;
  24. }
  25.  
  26. int shortest_path(vector<int>& primes, int p, int q, int l) {
  27.     queue<vector<int>> qu;
  28.     qu.push({1, p});
  29.     int upper_bit_limit = floor(log(l)/log(2)) + 1;
  30.     primes.erase(remove(primes.begin(), primes.end(), p), primes.end());
  31.  
  32.     while (!qu.empty()) {
  33.         vector<int> t = qu.front();
  34.         qu.pop();
  35.  
  36.         int node = t[1];
  37.         int prev_len = t[0];
  38.  
  39.         if (node == q) return prev_len;
  40.  
  41.         for (int i = 0; i < upper_bit_limit; ++i) {
  42.             int diff = 1 << i;
  43.  
  44.             int next_one = node + diff;
  45.             if (find(primes.begin(), primes.end(), next_one) != primes.end()) {
  46.                 primes.erase(remove(primes.begin(), primes.end(), next_one), primes.end());
  47.                 qu.push({prev_len+1, next_one});
  48.             }
  49.  
  50.             next_one = node - diff;
  51.             if (find(primes.begin(), primes.end(), next_one) != primes.end()) {
  52.                 primes.erase(remove(primes.begin(), primes.end(), next_one), primes.end());
  53.                 qu.push({prev_len+1, next_one});
  54.             }
  55.         }
  56.     }
  57.     cout << "NOT FOUND" << endl;
  58.     return -1;
  59. }
  60.  
  61. int solve(int l, int p, int q) {
  62.     vector<int> primes = find_primes(l);
  63.  
  64.     return shortest_path(primes, p, q, l);
  65. }
  66.  
  67. int main() {
  68.     int l, p, q;
  69.     cin >> l >> p >> q;
  70.     cout << solve(l, p, q) << endl;
  71.  
  72.     return 0;
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement