#include <iostream>
#include <vector>
bool increase(std::size_t n, std::vector<std::size_t>& its)
{
for (auto rit = its.rbegin(); rit != its.rend(); ++rit) {
++*rit;
if (*rit >= n) {
*rit = 0;
} else {
return true;
}
}
return false;
}
template <typename F, typename C>
void iterate(F f, const C& v, std::size_t k)
{
std::vector<std::size_t> it(k, 0);
do {
f(v, it);
} while (increase(v.size(), it));
}
void print(const std::vector<char>& v, const std::vector<std::size_t>& it)
{
for (const auto e : it) {
std::cout << v[e] << " ";
}
std::cout << std::endl;
}
int main()
{
std::vector<char> v = {'a', 'b', 'c'};
iterate(print, v, 2);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKYm9vbCBpbmNyZWFzZShzdGQ6OnNpemVfdCBuLCBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4mIGl0cykKewogICAgZm9yIChhdXRvIHJpdCA9IGl0cy5yYmVnaW4oKTsgcml0ICE9IGl0cy5yZW5kKCk7ICsrcml0KSB7CiAgICAgICAgKysqcml0OwogICAgICAgIGlmICgqcml0ID49IG4pIHsKICAgICAgICAgICAgKnJpdCA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRiwgdHlwZW5hbWUgQz4Kdm9pZCBpdGVyYXRlKEYgZiwgY29uc3QgQyYgdiwgc3RkOjpzaXplX3QgaykKewogICAgc3RkOjp2ZWN0b3I8c3RkOjpzaXplX3Q+IGl0KGssIDApOwogCiAgICBkbyB7CiAgICAgICAgZih2LCBpdCk7CiAgICB9IHdoaWxlIChpbmNyZWFzZSh2LnNpemUoKSwgaXQpKTsKfQogCnZvaWQgcHJpbnQoY29uc3Qgc3RkOjp2ZWN0b3I8Y2hhcj4mIHYsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiYgaXQpCnsKICAgIGZvciAoY29uc3QgYXV0byBlIDogaXQpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgdltlXSA8PCAiICI7CiAgICB9CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwp9CiAKaW50IG1haW4oKQp7CiAgICBzdGQ6OnZlY3RvcjxjaGFyPiB2ID0geydhJywgJ2InLCAnYyd9OwogCiAgICBpdGVyYXRlKHByaW50LCB2LCAyKTsKfQo=