#include <iostream>
#include <vector>
//#include <string>
#include <cmath>

int main(int argc, char* argv)
{
	std::vector<std::string> signs;
	signs.push_back("a");
	signs.push_back("b");

	size_t digits = 3;
	size_t num_variations = pow(signs.size(), digits);

	std::vector<std::string> variations;
	variations.resize(num_variations * digits);

	size_t sign_index = 0;
	
	for (size_t column = 0; column < digits; ++column)
	{
		size_t row = 0;
		
		for (size_t subindex1 = 0; subindex1 < pow(signs.size(), column + 1); ++subindex1)
		{
			for (size_t subindex2 = 0; subindex2 < pow(signs.size(), digits - (column + 1)); ++subindex2)
			{
				variations[digits * row + column] = signs[sign_index % signs.size()];

				++row;
			}

			++sign_index;	
		}
	}

	size_t index = 0;
	for (size_t index_a = 0; index_a < num_variations; ++index_a)
	{
		for (size_t index_b = 0; index_b < digits; ++index_b)
		{
			std::cout << variations[index] << " ";
			++index;
		}
		std::cout << '\n';
	}
}