#include <vector>
#include <string>
#include <iostream>
#include <iomanip>
using namespace std;
class Gray
{
public:
Gray(int N):N(N),a(N+1,false),last_(-1){}
~Gray() = default;
Gray(const Gray&) = default;
Gray(Gray&&) = default;
Gray& operator=(const Gray&) = default;
Gray& operator=(Gray&&) = default;
size_t size() const { return N; }
void reset(size_t newN = 0)
{
if (newN) N = newN;
vector<bool> b(N+1,false);
std::swap(a,b);
last_ = -1;
}
bool operator[](size_t idx) const { return a[idx]; }
int last() const { return last_; }
bool next()
{
size_t j;
if (!a[N]) j = 0; else {
for(j = 0; j < N; ++j) if (a[j]) break;
++j;
}
if (j == N) return false;
a[N] = !a[N];
a[j] = !a[j];
last_ = j;
return true;
}
private:
vector<bool> a;
size_t N;
int last_;
};
int main(int argc, const char * argv[])
{
int m[] = { 2, 3, 5, 7 };
Gray g(sizeof(m)/sizeof(m[0]));
do {
if (g.last() >= 0)
{
int p = 1;
for(size_t i = 0; i < g.size(); ++i) if (g[i]) p *= m[i];
cout << setw(6) << p << " = ";
for(size_t i = 0, first = 1; i < g.size(); ++i)
if (g[i]) {
if (!first)
{
cout << " * ";
}
else
{
first = 0;
}
cout << m[i];
}
cout << "\n";
}
} while(g.next());
// Только произведения - если нет нулевого элемента.
g.reset();
int p = 1;
do {
if (g.last() >= 0)
{
if (g[g.last()]) p *= m[g.last()]; else p /= m[g.last()];
cout << setw(6) << p <<"\n";
}
} while(g.next());
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBHcmF5CnsKcHVibGljOgogICAgR3JheShpbnQgTik6TihOKSxhKE4rMSxmYWxzZSksbGFzdF8oLTEpe30KICAgIH5HcmF5KCkgPSBkZWZhdWx0OwogICAgR3JheShjb25zdCBHcmF5JikgPSBkZWZhdWx0OwogICAgR3JheShHcmF5JiYpICAgICAgPSBkZWZhdWx0OwogICAgR3JheSYgb3BlcmF0b3I9KGNvbnN0IEdyYXkmKSA9IGRlZmF1bHQ7CiAgICBHcmF5JiBvcGVyYXRvcj0oR3JheSYmKSAgICAgID0gZGVmYXVsdDsKCiAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE47IH0KICAgIHZvaWQgcmVzZXQoc2l6ZV90IG5ld04gPSAwKQogICAgewogICAgICAgIGlmIChuZXdOKSBOID0gbmV3TjsKICAgICAgICB2ZWN0b3I8Ym9vbD4gYihOKzEsZmFsc2UpOwogICAgICAgIHN0ZDo6c3dhcChhLGIpOwogICAgICAgIGxhc3RfID0gLTE7CiAgICB9CgogICAgYm9vbCBvcGVyYXRvcltdKHNpemVfdCBpZHgpIGNvbnN0IHsgcmV0dXJuIGFbaWR4XTsgfQoKICAgIGludCAgbGFzdCgpIGNvbnN0IHsgcmV0dXJuIGxhc3RfOyB9CgogICAgYm9vbCBuZXh0KCkKICAgIHsKICAgICAgICBzaXplX3QgajsKICAgICAgICBpZiAoIWFbTl0pIGogPSAwOyBlbHNlIHsKICAgICAgICAgICAgZm9yKGogPSAwOyBqIDwgTjsgKytqKSBpZiAoYVtqXSkgYnJlYWs7CiAgICAgICAgICAgICsrajsKICAgICAgICB9CiAgICAgICAgaWYgKGogPT0gTikgcmV0dXJuIGZhbHNlOwogICAgICAgIGFbTl0gPSAhYVtOXTsKICAgICAgICBhW2pdID0gIWFbal07CiAgICAgICAgbGFzdF8gPSBqOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQpwcml2YXRlOgogICAgdmVjdG9yPGJvb2w+IGE7CiAgICBzaXplX3QgTjsKICAgIGludCBsYXN0XzsKfTsKCgoKaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBhcmd2W10pCnsKICAgIGludCBtW10gPSB7IDIsIDMsIDUsIDcgfTsKCiAgICBHcmF5IGcoc2l6ZW9mKG0pL3NpemVvZihtWzBdKSk7CiAgICBkbyB7CiAgICAgICAgaWYgKGcubGFzdCgpID49IDApCiAgICAgICAgewogICAgICAgICAgICBpbnQgcCA9IDE7CiAgICAgICAgICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBnLnNpemUoKTsgKytpKSBpZiAoZ1tpXSkgcCAqPSBtW2ldOwogICAgICAgICAgICBjb3V0IDw8IHNldHcoNikgPDwgcCA8PCAiID0gIjsKICAgICAgICAgICAgZm9yKHNpemVfdCBpID0gMCwgZmlyc3QgPSAxOyBpIDwgZy5zaXplKCk7ICsraSkKICAgICAgICAgICAgICAgIGlmIChnW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvdXQgPDwgIiAqICI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY291dCA8PCBtW2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBjb3V0IDw8ICJcbiI7CiAgICAgICAgfQogICAgfSB3aGlsZShnLm5leHQoKSk7CgogICAgLy8g0KLQvtC70YzQutC+INC/0YDQvtC40LfQstC10LTQtdC90LjRjyAtINC10YHQu9C4INC90LXRgiDQvdGD0LvQtdCy0L7Qs9C+INGN0LvQtdC80LXQvdGC0LAuCgogICAgZy5yZXNldCgpOwoKICAgIGludCBwID0gMTsKICAgIGRvIHsKICAgICAgICBpZiAoZy5sYXN0KCkgPj0gMCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChnW2cubGFzdCgpXSkgcCAqPSBtW2cubGFzdCgpXTsgZWxzZSBwIC89IG1bZy5sYXN0KCldOwogICAgICAgICAgICBjb3V0IDw8IHNldHcoNikgPDwgcCA8PCJcbiI7CiAgICAgICAgfQogICAgfSB3aGlsZShnLm5leHQoKSk7Cgp9Cg==