#include <iostream>
#include <utility>
#include <vector>
bool increase(const std::vector<std::pair<std::size_t, std::size_t>>& v,
std::vector<std::size_t>& it)
{
for (std::size_t i = 0, size = it.size(); i != size; ++i) {
const std::size_t index = size - 1 - i;
++it[index];
if (it[index] > v[index].second) {
it[index] = 0;
} else {
return true;
}
}
return false;
}
std::size_t pow(std::size_t n, std::size_t power)
{
std::size_t res = 1;
for (std::size_t i = 0; i != power; ++i) {
res *= n;
}
return res;
}
void do_job(const std::vector<std::pair<std::size_t, std::size_t>>& v,
std::vector<std::size_t> it)
{
std::size_t res = 1;
for (std::size_t i = 0; i != v.size(); ++i) {
res *= pow(v[i].first, it[i]);
}
std::cout << res << std::endl;
}
void iterate(const std::vector<std::pair<std::size_t, std::size_t>>& v)
{
std::vector<std::size_t> it(v.size(), 0);
do {
do_job(v, it);
} while (increase(v, it));
}
int main()
{
const std::vector<std::pair<std::size_t, std::size_t>> v{{2, 2}, {3, 1}, {5, 1}, {7, 2}};
iterate(v);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHZlY3Rvcj4KCmJvb2wgaW5jcmVhc2UoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c2l6ZV90LCBzdGQ6OnNpemVfdD4+JiB2LAogICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiYgaXQpCnsKICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDAsIHNpemUgPSBpdC5zaXplKCk7IGkgIT0gc2l6ZTsgKytpKSB7CiAgICAgICAgY29uc3Qgc3RkOjpzaXplX3QgaW5kZXggPSBzaXplIC0gMSAtIGk7CiAgICAgICAgKytpdFtpbmRleF07CiAgICAgICAgaWYgKGl0W2luZGV4XSA+IHZbaW5kZXhdLnNlY29uZCkgewogICAgICAgICAgICBpdFtpbmRleF0gPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQoKc3RkOjpzaXplX3QgcG93KHN0ZDo6c2l6ZV90IG4sIHN0ZDo6c2l6ZV90IHBvd2VyKQp7CiAgICBzdGQ6OnNpemVfdCByZXMgPSAxOwogICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSAhPSBwb3dlcjsgKytpKSB7CiAgICAgICAgcmVzICo9IG47CiAgICB9CiAgICByZXR1cm4gcmVzOwp9Cgp2b2lkIGRvX2pvYihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzaXplX3QsIHN0ZDo6c2l6ZV90Pj4mIHYsCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiBpdCkKewogICAgc3RkOjpzaXplX3QgcmVzID0gMTsKICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgIT0gdi5zaXplKCk7ICsraSkgewogICAgICAgIHJlcyAqPSBwb3codltpXS5maXJzdCwgaXRbaV0pOyAgICAgICAgIAogICAgfQogICAgc3RkOjpjb3V0IDw8IHJlcyA8PCBzdGQ6OmVuZGw7IAp9Cgp2b2lkIGl0ZXJhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c2l6ZV90LCBzdGQ6OnNpemVfdD4+JiB2KQp7CiAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4gaXQodi5zaXplKCksIDApOwoKICAgIGRvIHsKICAgICAgICBkb19qb2IodiwgaXQpOwogICAgfSB3aGlsZSAoaW5jcmVhc2UodiwgaXQpKTsKfQoKaW50IG1haW4oKQp7CiAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzaXplX3QsIHN0ZDo6c2l6ZV90Pj4gdnt7MiwgMn0sIHszLCAxfSwgIHs1LCAxfSwgezcsIDJ9fTsKICAgIAogICAgaXRlcmF0ZSh2KTsKfQo=