#include <iostream>
#include <vector>
bool increment(std::vector<std::size_t>& v, std::size_t maxSize)
{
for (auto it = v.rbegin(); it != v.rend(); ++it) {
++*it;
if (*it != maxSize) {
return true;
}
*it = 0;
}
return false;
}
void print(const std::vector<int>&v, const std::vector<std::size_t>& indexes)
{
const char* sep = "";
for (auto index : indexes) {
std::cout << sep << v[index];
sep = ".";
}
std::cout << std::endl;
}
void print_cartesian_product(const std::vector<int>&v, int n)
{
std::vector<std::size_t> indexes(n);
do {
print(v, indexes);
} while (increment(indexes, v.size()));
}
int main()
{
print_cartesian_product({4, 8, 42}, 3);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKYm9vbCBpbmNyZW1lbnQoc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+JiB2LCBzdGQ6OnNpemVfdCBtYXhTaXplKQp7CiAgICBmb3IgKGF1dG8gaXQgPSB2LnJiZWdpbigpOyBpdCAhPSB2LnJlbmQoKTsgKytpdCkgewogICAgICAgICsrKml0OwogICAgICAgIGlmICgqaXQgIT0gbWF4U2l6ZSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgKml0ID0gMDsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKdm9pZCBwcmludChjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JnYsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiYgaW5kZXhlcykKewogICAgY29uc3QgY2hhciogc2VwID0gIiI7CiAgICBmb3IgKGF1dG8gaW5kZXggOiBpbmRleGVzKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IHNlcCA8PCB2W2luZGV4XTsKICAgICAgICBzZXAgPSAiLiI7CiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwp9Cgp2b2lkIHByaW50X2NhcnRlc2lhbl9wcm9kdWN0KGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mdiwgaW50IG4pCnsKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiBpbmRleGVzKG4pOwogICAgCiAgICBkbyB7CiAgICAgICAgcHJpbnQodiwgaW5kZXhlcyk7CiAgICB9IHdoaWxlIChpbmNyZW1lbnQoaW5kZXhlcywgdi5zaXplKCkpKTsKICAgIAp9CgppbnQgbWFpbigpCnsKICAgIHByaW50X2NhcnRlc2lhbl9wcm9kdWN0KHs0LCA4LCA0Mn0sIDMpOwp9