firedigger

Untitled

Oct 5th, 2015
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.07 KB | None | 0 0
  1. #include<iostream>
  2. #include<vector>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<string>
  6. #include<numeric>
  7. #include<set>
  8. #include<unordered_set>
  9. #include<queue>
  10. #include<bitset>
  11. #include<list>
  12.  
  13. using namespace std;
  14.  
  15. long long u(std::string str)
  16. {
  17.     long long n = 0;
  18.     for (auto x : str)
  19.         n = n * 10 + (x - '0');
  20.     return n;
  21. }
  22.  
  23. int Hamming_number_part2(std::string N, int K)
  24. {
  25.     int r = 0;
  26.     int q = 0;
  27.  
  28.     std::vector<bool> a(K + 1, true);
  29.     for (size_t i = 2; i <= K; ++i)
  30.         for (size_t j = 2 * i; j <= K; j += i)
  31.             a[j] = false;
  32.  
  33.     std::vector<int> b;
  34.     for (size_t i = 2; i <= K; ++i)
  35.         if (a[i])
  36.             b.push_back(i);
  37.  
  38.     std::list<long long> nums;
  39.     nums.push_back(1);
  40.  
  41.     std::vector<decltype(nums.cbegin())> pos(b.size(), nums.cbegin());
  42.     std::vector<long long> temp(b.size());
  43.    
  44.     auto n = u(N);
  45.     while (nums.back() < n)
  46.     {
  47.         for (size_t i = 0; i < b.size(); ++i)
  48.         {
  49.             while ((*pos[i]) * b[i] <= nums.back())
  50.                 ++pos[i];
  51.             temp[i] = (*pos[i]) * b[i];
  52.         }
  53.  
  54.         auto f = *std::min_element(temp.cbegin(), temp.cend());
  55.         nums.push_back(f);
  56.         ++r;
  57.     }
  58.  
  59.     return r;
  60. }
  61.  
  62. int Hamming_number_part1(std::string N, int K)
  63. {
  64.     std::set<long long> s;
  65.     int r = 0;
  66.     int q = 0;
  67.  
  68.     std::vector<bool> a(K + 1, true);
  69.     for (size_t i = 2; i <= K; ++i)
  70.         for (size_t j = 2 * i; j <= K; j += i)
  71.             a[j] = false;
  72.  
  73.     std::vector<int> b;
  74.     for (size_t i = 2; i <= K; ++i)
  75.         if (a[i])
  76.             b.push_back(i);
  77.  
  78.     for (auto x : b)
  79.         s.insert(x);
  80.  
  81.     auto n = u(N);
  82.     while (!s.empty())
  83.     {
  84.         auto f = *s.begin();
  85.  
  86.         size_t i = 0;
  87.  
  88.         while (i < b.size() && f % b[i] != 0)
  89.             ++i;
  90.        
  91.         while(i < b.size())
  92.         {
  93.             auto x = b[i];
  94.             auto f1 = f*x;
  95.  
  96.             if (f1 <= n)
  97.             {
  98.                 if (s.count(f1) > 0)
  99.                     cout << f1 << endl;
  100.                 //cout << f*x << endl;
  101.                 s.insert(f1);
  102.                 ++q;
  103.             }
  104.             ++i;
  105.         }
  106.         s.erase(s.begin());
  107.         ++r;
  108.         //if (r % 10 == 0)
  109.         //  cout << f << endl;
  110.     }
  111.     cout << q << endl;
  112.     return r+1;
  113. }
  114.  
  115. int main()
  116. {
  117.     long long t = 1e10;
  118.     cout << t << endl;
  119.     cout << Hamming_number_part2(to_string(t), 100) << endl;
  120.  
  121.     system("PAUSE");
  122.  
  123.     return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment