#include #include #include class CTriangle { std::vector> m_Triangle; size_t m_Rows = 40; public: CTriangle() { m_Triangle.emplace_back( std::vector(1, 1) ); m_Triangle.emplace_back( std::vector(1, 1) ); for(size_t rowIndex = m_Triangle.size() - 1; rowIndex < m_Rows - 1; ++rowIndex) { std::vector newRow; newRow.emplace_back(1); for(size_t inRowPosition = 0; inRowPosition < m_Triangle[rowIndex].size() - 1; ++inRowPosition){ newRow.emplace_back(m_Triangle[rowIndex][inRowPosition] + m_Triangle[rowIndex][inRowPosition + 1]); } if(m_Triangle[rowIndex].size() == m_Triangle[rowIndex - 1].size()){ newRow.emplace_back(m_Triangle[rowIndex][m_Triangle[rowIndex].size() - 1] * 2); } m_Triangle.emplace_back(newRow); } } size_t findNumber(const size_t number) { size_t result; while (! (result = findInExisting(number))){ resize(); } return result; } private: size_t findInExisting(const size_t number) const { for(size_t row = 0; row < m_Triangle.size(); ++row){ for(size_t index = 0; index < m_Triangle[row].size(); ++index){ if(m_Triangle[row][index] == number){ return row + 1; } if(m_Triangle[row][index] > number){ break; } } } return 0; } void resize() { m_Rows += 10; for(size_t rowIndex = m_Triangle.size() - 1; rowIndex < m_Rows - 1; ++rowIndex) { std::vector newRow; newRow.emplace_back(1); for(size_t inRowPosition = 0; inRowPosition < m_Triangle[rowIndex].size() - 1; ++inRowPosition){ newRow.emplace_back(m_Triangle[rowIndex][inRowPosition] + m_Triangle[rowIndex][inRowPosition + 1]); } if(m_Triangle[rowIndex].size() == m_Triangle[rowIndex - 1].size()){ newRow.emplace_back(m_Triangle[rowIndex][m_Triangle[rowIndex].size() - 1] * 2); } m_Triangle.emplace_back(newRow); } } }; int main() { CTriangle triangle; size_t toFindCnt, toFind; std::cin >> toFindCnt; for(size_t i = 0; i < toFindCnt; ++i){ std::cin >> toFind; std::cout << triangle.findNumber(toFind) << std::endl; } return 0; }