#include <queue>
#include <map>
#include <iostream>
class C {
public:
/* a^b + c^d */
int a, b, c, d;
public:
C();
C(int a, int b, int c, int d);
C(const C &obj);
C &operator=(C c);
friend std::ostream &operator<<(std::ostream &s, C const &c);
friend int f(C const &c);
friend void phasenext(std::vector<C> &rv, C const &c);
};
C::C(){}
C::C(int a, int b, int c, int d) { this->a = a; this->b = b; this->c = c; this->d = d; }
C::C(const C &obj) { this->a = obj.a; this->b = obj.b; this->c = obj.c; this->d = obj.d; }
C &C::operator=(C obj) { this->a = obj.a; this->b = obj.b; this->c = obj.c; this->d = obj.d; return *this; }
int f(C const &c) {
int s1 = 1, s2 = 1;
for (int i = 0; i < c.b; i++) s1 *= c.a;
for (int i = 0; i < c.d; i++) s2 *= c.c;
return s1 + s2;
}
std::ostream &operator<<(std::ostream &s, C const &c) {
s << c.a << '^' << c.b << '+' << c.c << '^' << c.d << '=' << f(c);
return s;
}
void phasenext(std::vector<C> &rv, C const &c) {
C r;
r.a = c.a + 1; r.b = c.b; r.c = c.c; r.d = c.d;
if (c.a <= c.c)
rv.push_back(r);
r.a = c.a; r.b = c.b + 1; r.c = c.c; r.d = c.d;
if (c.a <= c.c)
rv.push_back(r);
r.a = c.a; r.b = c.b; r.c = c.c + 1; r.d = c.d;
if (c.a <= c.c)
rv.push_back(r);
r.a = c.a; r.b = c.b; r.c = c.c; r.d = c.d + 1;
if (c.a <= c.c)
rv.push_back(r);
}
class PriorityQueueCompare {
public:
bool operator()(C const &a, C const &b) { return f(a) < f(b); }
};
class MapCompare : public C {
public:
bool operator()(C const &a, C const &b) {
if (a.a < b.a) return true;
if (a.a == b.a && a.b < b.b) return true;
if (a.a == b.a && a.b == b.b && a.c < b.c) return true;
if (a.a == b.a && a.b == b.b && a.c == b.c && a.d < b.d) return true;
return false;
}
};
const int TARGET = 2017;
int main ()
{
std::priority_queue<C, std::vector<C>, PriorityQueueCompare > priority_queue;
std::map<C, int, MapCompare> map;
C first(2, 2, 2, 2);
priority_queue.push(first);
map[first] = 1;
while (!priority_queue.empty()) {
C got = priority_queue.top();
priority_queue.pop();
if (f(got) == TARGET)
std::cout << got << std::endl;
if (f(got) < TARGET) {
std::vector<C> next;
phasenext(next, got);
for (std::vector<C>::iterator i = next.begin(); i != next.end(); i++) {
if (map.find(*i) == map.end()) {
map[*i] = 1;
priority_queue.push(*i);
}
}
// std::cout << "::" << got << std::endl;
}
}
return 0;
}
/* end */
I2luY2x1ZGUgPHF1ZXVlPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8aW9zdHJlYW0+CgpjbGFzcyBDIHsKcHVibGljOgogIC8qIGFeYiArIGNeZCAqLwogIGludCBhLCBiLCBjLCBkOwoKcHVibGljOgogIEMoKTsKICBDKGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkKTsKICBDKGNvbnN0IEMgJm9iaik7CiAgQyAmb3BlcmF0b3I9KEMgYyk7CiAgZnJpZW5kIHN0ZDo6b3N0cmVhbSAmb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJnMsIEMgY29uc3QgJmMpOwogIGZyaWVuZCBpbnQgZihDIGNvbnN0ICZjKTsKICBmcmllbmQgdm9pZCBwaGFzZW5leHQoc3RkOjp2ZWN0b3I8Qz4gJnJ2LCBDIGNvbnN0ICZjKTsKfTsKQzo6Qygpe30KQzo6QyhpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCkgeyB0aGlzLT5hID0gYTsgdGhpcy0+YiA9IGI7IHRoaXMtPmMgPSBjOyB0aGlzLT5kID0gZDsgfQpDOjpDKGNvbnN0IEMgJm9iaikgeyB0aGlzLT5hID0gb2JqLmE7IHRoaXMtPmIgPSBvYmouYjsgdGhpcy0+YyA9IG9iai5jOyB0aGlzLT5kID0gb2JqLmQ7IH0KQyAmQzo6b3BlcmF0b3I9KEMgb2JqKSB7IHRoaXMtPmEgPSBvYmouYTsgdGhpcy0+YiA9IG9iai5iOyB0aGlzLT5jID0gb2JqLmM7IHRoaXMtPmQgPSBvYmouZDsgcmV0dXJuICp0aGlzOyB9CmludCBmKEMgY29uc3QgJmMpIHsKICBpbnQgczEgPSAxLCBzMiA9IDE7CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBjLmI7IGkrKykgczEgKj0gYy5hOwogIGZvciAoaW50IGkgPSAwOyBpIDwgYy5kOyBpKyspIHMyICo9IGMuYzsKICByZXR1cm4gczEgKyBzMjsKfQpzdGQ6Om9zdHJlYW0gJm9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtICZzLCBDIGNvbnN0ICZjKSB7CiAgcyA8PCBjLmEgPDwgJ14nIDw8IGMuYiA8PCAnKycgPDwgYy5jIDw8ICdeJyA8PCBjLmQgPDwgJz0nIDw8IGYoYyk7CiAgcmV0dXJuIHM7Cn0KCnZvaWQgcGhhc2VuZXh0KHN0ZDo6dmVjdG9yPEM+ICZydiwgQyBjb25zdCAmYykgewogIEMgcjsKICByLmEgPSBjLmEgKyAxOyByLmIgPSBjLmI7IHIuYyA9IGMuYzsgci5kID0gYy5kOwogIGlmIChjLmEgPD0gYy5jKQogICAgcnYucHVzaF9iYWNrKHIpOwogIHIuYSA9IGMuYTsgci5iID0gYy5iICsgMTsgci5jID0gYy5jOyByLmQgPSBjLmQ7CiAgaWYgKGMuYSA8PSBjLmMpCiAgICBydi5wdXNoX2JhY2socik7CiAgci5hID0gYy5hOyByLmIgPSBjLmI7IHIuYyA9IGMuYyArIDE7IHIuZCA9IGMuZDsKICBpZiAoYy5hIDw9IGMuYykKICAgIHJ2LnB1c2hfYmFjayhyKTsKICByLmEgPSBjLmE7IHIuYiA9IGMuYjsgci5jID0gYy5jOyByLmQgPSBjLmQgKyAxOwogIGlmIChjLmEgPD0gYy5jKQogICAgcnYucHVzaF9iYWNrKHIpOwp9CgpjbGFzcyBQcmlvcml0eVF1ZXVlQ29tcGFyZSB7CnB1YmxpYzoKICBib29sIG9wZXJhdG9yKCkoQyBjb25zdCAmYSwgQyBjb25zdCAmYikgeyByZXR1cm4gZihhKSA8IGYoYik7IH0KfTsKCmNsYXNzIE1hcENvbXBhcmUgOiBwdWJsaWMgQyB7CnB1YmxpYzoKICBib29sIG9wZXJhdG9yKCkoQyBjb25zdCAmYSwgQyBjb25zdCAmYikgewogICAgaWYgKGEuYSA8IGIuYSkgcmV0dXJuIHRydWU7CiAgICBpZiAoYS5hID09IGIuYSAmJiBhLmIgPCBiLmIpIHJldHVybiB0cnVlOwogICAgaWYgKGEuYSA9PSBiLmEgJiYgYS5iID09IGIuYiAmJiBhLmMgPCBiLmMpIHJldHVybiB0cnVlOwogICAgaWYgKGEuYSA9PSBiLmEgJiYgYS5iID09IGIuYiAmJiBhLmMgPT0gYi5jICYmIGEuZCA8IGIuZCkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQp9OwoKY29uc3QgaW50IFRBUkdFVCA9IDIwMTc7CmludCBtYWluICgpCnsKICBzdGQ6OnByaW9yaXR5X3F1ZXVlPEMsIHN0ZDo6dmVjdG9yPEM+LCBQcmlvcml0eVF1ZXVlQ29tcGFyZSA+IHByaW9yaXR5X3F1ZXVlOwogIHN0ZDo6bWFwPEMsIGludCwgTWFwQ29tcGFyZT4gbWFwOwogIAogIEMgZmlyc3QoMiwgMiwgMiwgMik7CiAgcHJpb3JpdHlfcXVldWUucHVzaChmaXJzdCk7CiAgbWFwW2ZpcnN0XSA9IDE7CgogIHdoaWxlICghcHJpb3JpdHlfcXVldWUuZW1wdHkoKSkgewogICAgQyBnb3QgPSBwcmlvcml0eV9xdWV1ZS50b3AoKTsKICAgIHByaW9yaXR5X3F1ZXVlLnBvcCgpOwoKICAgIGlmIChmKGdvdCkgPT0gVEFSR0VUKQogICAgICBzdGQ6OmNvdXQgPDwgZ290IDw8IHN0ZDo6ZW5kbDsKICAgIGlmIChmKGdvdCkgPCBUQVJHRVQpIHsKICAgICAgc3RkOjp2ZWN0b3I8Qz4gbmV4dDsKICAgICAgcGhhc2VuZXh0KG5leHQsIGdvdCk7CiAgICAgIGZvciAoc3RkOjp2ZWN0b3I8Qz46Oml0ZXJhdG9yIGkgPSBuZXh0LmJlZ2luKCk7IGkgIT0gbmV4dC5lbmQoKTsgaSsrKSB7CiAgICAgICAgaWYgKG1hcC5maW5kKCppKSA9PSBtYXAuZW5kKCkpIHsKICAgICAgICAgIG1hcFsqaV0gPSAxOwogICAgICAgICAgcHJpb3JpdHlfcXVldWUucHVzaCgqaSk7CiAgICAgICAgfQogICAgICB9Ci8vICAgICAgc3RkOjpjb3V0IDw8ICI6OiIgPDwgZ290IDw8IHN0ZDo6ZW5kbDsKICAgIH0KICB9CgogIHJldHVybiAwOwp9Ci8qIGVuZCAqLwo=