Advertisement
andruhovski

TaskF

May 26th, 2016
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. // TaskF.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. #include <vector>
  7. #include <bitset>
  8. #include <iostream>
  9. #include <utility>
  10. #include <map>
  11.  
  12. std::map<unsigned long long, unsigned __int64> table;
  13. std::vector<unsigned long long> snum(40);
  14. std::vector<unsigned long long> result;
  15.  
  16.  
  17. int _tmain(int argc, _TCHAR* argv[])
  18. {
  19.     unsigned __int64 st = 1;
  20.     unsigned __int64 nn = 1024;
  21.     unsigned __int64 tmp;
  22.     unsigned __int64 i, k, n = 32;
  23.     unsigned long long res;
  24.    
  25.     k = 1i64 << n;
  26.    
  27.     for (auto index = 0; index < n; index++)
  28.     {
  29.         snum[index] = st;
  30.         st *= 3;
  31.     }
  32.  
  33.    
  34.     for (i = 1; i<k - 1; i++)
  35.     {
  36.         tmp = i;
  37.         res = 0;
  38.         for (auto index = 0; index < n; index++)
  39.         {
  40.             if (tmp % 2)
  41.                 res += snum[index];        
  42.             tmp /=2;
  43.         }      
  44.         table.insert(std::make_pair(res, i));
  45.         if (!(i % 1000000)) std::cout << i << std::endl;
  46.     }
  47.    
  48.     auto r1 = table.lower_bound(nn);
  49.     if (r1->first != nn)
  50.     {
  51.         do
  52.         {
  53.             auto r2 = table.find(r1->first - nn);
  54.             if (r2 != table.end())
  55.             {
  56.                 //std::cout << r1->first << " " << r1->second << std::endl;
  57.                 //std::cout << r2->first << " " << r2->second << std::endl;
  58.                 tmp = r1->second;
  59.                 for (unsigned long index = 0; index < n; index++)
  60.                 {
  61.                     if (tmp % 2)
  62.                         result.push_back(snum[index]);
  63.                     tmp >>= 1;
  64.                 }
  65.  
  66.                 tmp = r2->second;
  67.                 for (unsigned long index = 0; index < n; index++)
  68.                 {
  69.                     if (tmp % 2)
  70.                         result.push_back(snum[index]);
  71.                     tmp >>= 1;
  72.                 }
  73. #ifndef _DEBUG
  74.                 sort(begin(result), end(result));
  75. #endif
  76.                 break;
  77.                 }
  78.  
  79.             r1 = ++r1;
  80.             } while (r1 != table.end());
  81.     }
  82.     else
  83.     {
  84.         result.push_back(nn);
  85.     }
  86.    
  87.     std::copy(begin(result), end(result), std::ostream_iterator<unsigned long>(std::cout," "));
  88.    
  89.     return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement