#include <iostream>
#include <vector>
enum class Op
{
ADD,
SUB
};
int evaluate(std::vector<int> numbers, std::vector<Op> operations, std::string & formula)
{
formula = std::to_string(numbers[0]);
int total = numbers[0];
for(int i = 0 ; i < operations.size() ; ++i)
{
if(operations[i] == Op::ADD)
{
formula += "+" + std::to_string(numbers[i+1]);
total += numbers[i+1];
}
else
{
formula += "-" + std::to_string(numbers[i+1]);
total -= numbers[i+1];
}
}
return total;
}
void generate(int level, std::vector<int> numbers, std::vector<Op> operations)
{
if(level == 10)
{
std::string formula;
if(evaluate(numbers, operations, formula) == 100)
{
std::cout << formula << " = 100" << std::endl;
}
return;
}
auto numbers_next = numbers;
numbers_next.push_back(level);
auto operations_add = operations;
operations_add.push_back(Op::ADD);
generate(level+1, numbers_next, operations_add);
auto operations_sub = operations;
operations_sub.push_back(Op::SUB);
generate(level+1, numbers_next, operations_sub);
auto numbers_num = numbers;
numbers_num.back() = numbers_num.back() * 10 + level;
generate(level+1, numbers_num, operations);
}
int main()
{
generate(2, {1}, {});
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKZW51bSBjbGFzcyBPcAp7CglBREQsCglTVUIKfTsKCmludCBldmFsdWF0ZShzdGQ6OnZlY3RvcjxpbnQ+IG51bWJlcnMsIHN0ZDo6dmVjdG9yPE9wPiBvcGVyYXRpb25zLCBzdGQ6OnN0cmluZyAmIGZvcm11bGEpCnsKCWZvcm11bGEgPSBzdGQ6OnRvX3N0cmluZyhudW1iZXJzWzBdKTsKCWludCB0b3RhbCA9IG51bWJlcnNbMF07Cglmb3IoaW50IGkgPSAwIDsgaSA8IG9wZXJhdGlvbnMuc2l6ZSgpIDsgKytpKQoJewoJCWlmKG9wZXJhdGlvbnNbaV0gPT0gT3A6OkFERCkgCgkJewoJCQlmb3JtdWxhICs9ICIrIiArIHN0ZDo6dG9fc3RyaW5nKG51bWJlcnNbaSsxXSk7CgkJCXRvdGFsICs9IG51bWJlcnNbaSsxXTsKCQl9CgkJZWxzZQoJCXsKCQkJZm9ybXVsYSArPSAiLSIgKyBzdGQ6OnRvX3N0cmluZyhudW1iZXJzW2krMV0pOwoJCQl0b3RhbCAtPSBudW1iZXJzW2krMV07CgkJfQoJfQoJCglyZXR1cm4gdG90YWw7Cn0KCnZvaWQgZ2VuZXJhdGUoaW50IGxldmVsLCBzdGQ6OnZlY3RvcjxpbnQ+IG51bWJlcnMsIHN0ZDo6dmVjdG9yPE9wPiBvcGVyYXRpb25zKQp7CglpZihsZXZlbCA9PSAxMCkKCXsKCQlzdGQ6OnN0cmluZyBmb3JtdWxhOwoJCWlmKGV2YWx1YXRlKG51bWJlcnMsIG9wZXJhdGlvbnMsIGZvcm11bGEpID09IDEwMCkKCQl7CgkJCXN0ZDo6Y291dCA8PCBmb3JtdWxhIDw8ICIgPSAxMDAiIDw8IHN0ZDo6ZW5kbDsKCQl9CgkJCgkJcmV0dXJuOwoJfQoKCWF1dG8gbnVtYmVyc19uZXh0ID0gbnVtYmVyczsKCW51bWJlcnNfbmV4dC5wdXNoX2JhY2sobGV2ZWwpOwoJCglhdXRvIG9wZXJhdGlvbnNfYWRkID0gb3BlcmF0aW9uczsKCW9wZXJhdGlvbnNfYWRkLnB1c2hfYmFjayhPcDo6QUREKTsKCWdlbmVyYXRlKGxldmVsKzEsIG51bWJlcnNfbmV4dCwgb3BlcmF0aW9uc19hZGQpOwoJCglhdXRvIG9wZXJhdGlvbnNfc3ViID0gb3BlcmF0aW9uczsKCW9wZXJhdGlvbnNfc3ViLnB1c2hfYmFjayhPcDo6U1VCKTsKCWdlbmVyYXRlKGxldmVsKzEsIG51bWJlcnNfbmV4dCwgb3BlcmF0aW9uc19zdWIpOwoKCWF1dG8gbnVtYmVyc19udW0gPSBudW1iZXJzOwkKCW51bWJlcnNfbnVtLmJhY2soKSA9IG51bWJlcnNfbnVtLmJhY2soKSAqIDEwICsgbGV2ZWw7CglnZW5lcmF0ZShsZXZlbCsxLCBudW1iZXJzX251bSwgb3BlcmF0aW9ucyk7Cn0KCmludCBtYWluKCkKewoJZ2VuZXJhdGUoMiwgezF9LCB7fSk7Cn0K