Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <cstdint>
- #include <fstream>
- #include <iostream>
- #include <vector>
- int calcDiskState(std::uint64_t currentDisk, std::uint64_t totalDisks, std::uint64_t turn)
- {
- const auto firstMoveOffset = 1ull << (currentDisk - 1); // 2^(n-1)
- if (turn < firstMoveOffset)
- return 1;
- const auto moves = 1 + ((turn - firstMoveOffset) >> currentDisk); // div by 2^n
- if ((totalDisks & 1 && currentDisk & 1) || (!(totalDisks & 1) && !(currentDisk & 1)))
- return static_cast<int>(moves % 3) + 1;
- return 3 - static_cast<int>((2 + moves) % 3);
- }
- void printState(const std::vector<int>& diskStates, std::ostream& out)
- {
- for (int i = 1; i <= 3; ++i)
- {
- out << i << ":";
- bool first = true;
- const auto diskCount = diskStates.size();
- for (std::size_t j = 0; j < diskCount; ++j)
- {
- const auto state = diskStates[diskCount - j - 1];
- if (state == i)
- {
- out << (first ? " " : "|");
- first = false;
- out << (diskCount - j);
- }
- }
- if (i != 3)
- out << "\n";
- }
- }
- void doCase(int caseNo, std::istream& in, std::ostream& out)
- {
- int disks = 0;
- std::uint64_t steps = 0;
- in >> disks >> steps;
- std::vector<int> diskStates(disks, 0);
- std::transform(
- std::cbegin(diskStates),
- std::cend(diskStates),
- std::begin(diskStates),
- [i = 0, steps, disks](int curState) mutable
- {
- return calcDiskState(++i, disks, steps);
- }
- );
- printState(diskStates, out);
- }
- int main()
- {
- #ifdef LOCAL
- std::ifstream in{ "input.txt" };
- std::ofstream out{ "out.txt" };
- #else
- auto& in = std::cin;
- auto& out = std::cout;
- #endif
- int cases = 0;
- in >> cases;
- for (int i = 0; i < cases; ++i)
- {
- doCase(i + 1, in, out);
- if (i != cases - 1)
- out << "\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement