Advertisement
DNKpp

Untitled

Nov 9th, 2020
746
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.77 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cstdint>
  3. #include <fstream>
  4. #include <iostream>
  5. #include <vector>
  6.  
  7. int calcDiskState(std::uint64_t currentDisk, std::uint64_t totalDisks, std::uint64_t turn)
  8. {
  9.     const auto firstMoveOffset = 1ull << (currentDisk - 1); // 2^(n-1)
  10.     if (turn < firstMoveOffset)
  11.         return 1;
  12.  
  13.     const auto moves = 1 + ((turn - firstMoveOffset) >> currentDisk); // div by 2^n
  14.  
  15.     if ((totalDisks & 1 && currentDisk & 1) || (!(totalDisks & 1) && !(currentDisk & 1)))
  16.         return static_cast<int>(moves % 3) + 1;
  17.     return 3 - static_cast<int>((2 + moves) % 3);
  18. }
  19.  
  20. void printState(const std::vector<int>& diskStates, std::ostream& out)
  21. {
  22.     for (int i = 1; i <= 3; ++i)
  23.     {
  24.         out << i << ":";
  25.         bool first = true;
  26.         const auto diskCount = diskStates.size();
  27.         for (std::size_t j = 0; j < diskCount; ++j)
  28.         {
  29.             const auto state = diskStates[diskCount - j - 1];
  30.             if (state == i)
  31.             {
  32.                 out << (first ? " " : "|");
  33.                 first = false;
  34.                 out << (diskCount - j);
  35.             }
  36.         }
  37.         if (i != 3)
  38.             out << "\n";
  39.     }
  40. }
  41.  
  42. void doCase(int caseNo, std::istream& in, std::ostream& out)
  43. {
  44.     int disks = 0;
  45.     std::uint64_t steps = 0;
  46.     in >> disks >> steps;
  47.  
  48.     std::vector<int> diskStates(disks, 0);
  49.     std::transform(
  50.                     std::cbegin(diskStates),
  51.                     std::cend(diskStates),
  52.                     std::begin(diskStates),
  53.                     [i = 0, steps, disks](int curState) mutable
  54.                     {
  55.                         return calcDiskState(++i, disks, steps);
  56.                     }
  57.                 );
  58.  
  59.     printState(diskStates, out);
  60. }
  61.  
  62. int main()
  63. {
  64. #ifdef LOCAL
  65.     std::ifstream in{ "input.txt" };
  66.     std::ofstream out{ "out.txt" };
  67. #else
  68.     auto& in = std::cin;
  69.     auto& out = std::cout;
  70. #endif
  71.  
  72.     int cases = 0;
  73.     in >> cases;
  74.  
  75.     for (int i = 0; i < cases; ++i)
  76.     {
  77.         doCase(i + 1, in, out);
  78.         if (i != cases - 1)
  79.             out << "\n";
  80.     }
  81.     return 0;
  82. }
  83.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement