#include <iostream>
#include <cstdint>
#include <algorithm>
#include <vector>
typedef std::vector<std::int64_t> DType;
bool AddDidit(DType& D, std::uint64_t R) {
bool C = false;
if (D.size() == 0) return false;
D[0]++;
for (std::size_t i = 0; i < D.size(); i++) {
if (C == true) {
D[i]++;
}
C = false;
if (D[i] >= R) {
D[i]= 0;
C = true;
}else {
break;
}
}
return C;
}
DType Pre(const DType& N,DType& D,const DType& E) {
DType R;
std::size_t P = 0;
for (std::size_t i = 0; i < N.size(); i++) {
if (E[i]) {
R.push_back(N[i]);
}else{
D.erase(D.begin() + (i - P));
P++;
}
}
for (std::size_t j = 0; j < D.size(); j++) {
for (std::size_t i = 0; i < D[j]; i++) {
R[j] *= R[j];
}
}
return R;
}
std::uint64_t Calc(DType D, DType Op) {
if (D.size() <= 1)return D[0];
for (std::size_t i = 0; i < Op.size(); i++) {
if (Op[i] == 2) {
D[i] *= D[i + 1];
D.erase(D.begin() + i + 1);
Op.erase(Op.begin() + i);
i--;
continue;
}
if (Op[i] == 3) {
D[i] /= D[i + 1];
D.erase(D.begin() + i + 1);
Op.erase(Op.begin() + i);
i--;
continue;
}
}
for (std::size_t i = 0; i < Op.size(); i++) {
if (Op[i] == 1) {
D[i] -= D[i + 1];
D.erase(D.begin() + i + 1);
Op.erase(Op.begin() + i);
i--;
continue;
}
if (Op[i] == 0) {
D[i] += D[i + 1];
D.erase(D.begin() + i + 1);
Op.erase(Op.begin() + i);
i--;
continue;
}
}
return D[0];
}
bool Show(const DType&N, const DType& D, const DType& O, const DType& E, const std::uint64_t& F, const std::uint64_t& L) {
char Op[] = "+-*/";
std::uint64_t C = 0;
for (std::size_t i = 0; i < N.size(); i++) {
if (E[i] == 0) {
C++;
continue;
}
//if (F == i)std::cout << '(';
std::cout << N[i];
if (D[i] != 0)std::cout << "^(2*" << D[i] << ")";
//if (L == i)std::cout << ')';
if (O.size() > (i-C))std::cout << Op[O[i-C]];
}
std::cout << std::endl;
return true;
}
bool ProsessKakko(DType& D, DType& Op, std::uint64_t F, std::uint64_t L) {
if (F == L) return false;
DType DC(D.begin() + F, D.begin() + L);
DType OC(Op.begin() + F, Op.begin() + (L-1));
if (OC.size() == 0)return false;
std::uint64_t A = Calc(DC, OC);
D.erase(D.begin() + F, D.begin() + L);
D.insert(D.begin() + F, A);
Op.erase(Op.begin() + F, Op.begin() + (L - 1));
return true;
}
bool MakeHogeOne(DType D, std::uint64_t A) {
DType Op;
DType Double;
DType Eraser;
DType T;
std::sort(D.begin(), D.end());
do {
Double.clear();
Double.resize(D.size());
do {
Eraser.clear();
Eraser.resize(D.size());
while (AddDidit(Eraser, 2)==false) {
DType Do = Double;
T = Pre(D, Do, Eraser);
Op.clear();
if (T.size() != 0) {
Op.resize(T.size() - 1);
}
else {
continue;
}
if (T.size() == 1) {
if (T[0] == A) {
Show(D, Double , Op,Eraser, 0, 0);
return true;
}
else {
continue;
}
}
for (std::uint64_t F = 0; F < T.size(); F++) {
for (std::uint64_t L= F; L < T.size(); L++) {
do {
//ProsessKakko(T, Op, F, L);
if (Calc(T, Op) == A) {
Show(D, Double , Op,Eraser, F, L);
return true;
}
} while (AddDidit(Op, 4)==false);
}
}
} ;
} while (AddDidit(Double, 8) == false);
} while (std::next_permutation(D.begin(), D.end()));
return false;
}
bool MakeHoge(DType D) {
for (std::size_t i = 1; MakeHogeOne(D, i); i++);
return true;
}
int main() {
DType D{ 3,5,7 };
// MakeHogeOne(D,1);
// MakeHogeOne(D,2);
MakeHoge(D);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGludD4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHZlY3Rvcj4KCnR5cGVkZWYgc3RkOjp2ZWN0b3I8c3RkOjppbnQ2NF90PiBEVHlwZTsKCmJvb2wgQWRkRGlkaXQoRFR5cGUmIEQsIHN0ZDo6dWludDY0X3QgUikgewoJYm9vbCBDID0gZmFsc2U7CglpZiAoRC5zaXplKCkgPT0gMCkgcmV0dXJuIGZhbHNlOwoJRFswXSsrOwoJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IEQuc2l6ZSgpOyBpKyspIHsKCQlpZiAoQyA9PSB0cnVlKSB7CgkJCURbaV0rKzsKCQl9CgkJQyA9IGZhbHNlOwoJCWlmIChEW2ldID49IFIpIHsKCQkJRFtpXT0gMDsKCQkJQyA9IHRydWU7CgkJfWVsc2UgewoJCQlicmVhazsKCQl9CgkJCgoJCQoJfQoKCXJldHVybiBDOwp9CgpEVHlwZSBQcmUoY29uc3QgRFR5cGUmIE4sRFR5cGUmIEQsY29uc3QgRFR5cGUmIEUpIHsKCURUeXBlIFI7CglzdGQ6OnNpemVfdCBQID0gMDsKCWZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBOLnNpemUoKTsgaSsrKSB7CgkJaWYgKEVbaV0pIHsKCQkJUi5wdXNoX2JhY2soTltpXSk7CgkJfWVsc2V7CgkJCUQuZXJhc2UoRC5iZWdpbigpICsgKGkgLSBQKSk7CgkJCVArKzsKCQl9Cgl9CgoJZm9yIChzdGQ6OnNpemVfdCBqID0gMDsgaiA8IEQuc2l6ZSgpOyBqKyspIHsKCQlmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgRFtqXTsgaSsrKSB7CgkJCVJbal0gKj0gUltqXTsKCQl9Cgl9CgoJcmV0dXJuIFI7Cn0KCnN0ZDo6dWludDY0X3QgQ2FsYyhEVHlwZSBELCBEVHlwZSBPcCkgewoJaWYgKEQuc2l6ZSgpIDw9IDEpcmV0dXJuIERbMF07Cglmb3IgKHN0ZDo6c2l6ZV90IGkgPSAwOyBpIDwgT3Auc2l6ZSgpOyBpKyspIHsKCQlpZiAoT3BbaV0gPT0gMikgewoJCQlEW2ldICo9IERbaSArIDFdOwoJCQlELmVyYXNlKEQuYmVnaW4oKSArIGkgKyAxKTsKCQkJT3AuZXJhc2UoT3AuYmVnaW4oKSArIGkpOwoJCQlpLS07CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAoT3BbaV0gPT0gMykgewoJCQlEW2ldIC89IERbaSArIDFdOwoJCQlELmVyYXNlKEQuYmVnaW4oKSArIGkgKyAxKTsKCQkJT3AuZXJhc2UoT3AuYmVnaW4oKSArIGkpOwoJCQlpLS07CgkJCWNvbnRpbnVlOwoJCX0KCX0KCWZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCBPcC5zaXplKCk7IGkrKykgewoJCWlmIChPcFtpXSA9PSAxKSB7CgkJCURbaV0gLT0gRFtpICsgMV07CgkJCUQuZXJhc2UoRC5iZWdpbigpICsgaSArIDEpOwoJCQlPcC5lcmFzZShPcC5iZWdpbigpICsgaSk7CgkJCWktLTsKCQkJY29udGludWU7CgkJfQoJCWlmIChPcFtpXSA9PSAwKSB7CgkJCURbaV0gKz0gRFtpICsgMV07CgkJCUQuZXJhc2UoRC5iZWdpbigpICsgaSArIDEpOwoJCQlPcC5lcmFzZShPcC5iZWdpbigpICsgaSk7CgkJCWktLTsKCQkJY29udGludWU7CgkJfQoJfQoKCXJldHVybiBEWzBdOwp9CmJvb2wgU2hvdyhjb25zdCBEVHlwZSZOLCBjb25zdCBEVHlwZSYgRCwgY29uc3QgRFR5cGUmIE8sIGNvbnN0IERUeXBlJiBFLCBjb25zdCBzdGQ6OnVpbnQ2NF90JiBGLCBjb25zdCBzdGQ6OnVpbnQ2NF90JiBMKSB7CgljaGFyIE9wW10gPSAiKy0qLyI7CglzdGQ6OnVpbnQ2NF90IEMgPSAwOwoJZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSA8IE4uc2l6ZSgpOyBpKyspIHsKCQlpZiAoRVtpXSA9PSAwKSB7CgkJCUMrKzsKCQkJY29udGludWU7CgkKCQl9CgkJLy9pZiAoRiA9PSBpKXN0ZDo6Y291dCA8PCAnKCc7CgkJc3RkOjpjb3V0IDw8IE5baV07CgkJaWYgKERbaV0gIT0gMClzdGQ6OmNvdXQgPDwgIl4oMioiIDw8IERbaV0gPDwgIikiOwoJCS8vaWYgKEwgPT0gaSlzdGQ6OmNvdXQgPDwgJyknOwoJCWlmIChPLnNpemUoKSA+IChpLUMpKXN0ZDo6Y291dCA8PCBPcFtPW2ktQ11dOwoJfQoJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKCXJldHVybiB0cnVlOwp9Cgpib29sIFByb3Nlc3NLYWtrbyhEVHlwZSYgRCwgRFR5cGUmIE9wLCBzdGQ6OnVpbnQ2NF90IEYsIHN0ZDo6dWludDY0X3QgTCkgewoJaWYgKEYgPT0gTCkgcmV0dXJuIGZhbHNlOwoJRFR5cGUgREMoRC5iZWdpbigpICsgRiwgRC5iZWdpbigpICsgTCk7CglEVHlwZSBPQyhPcC5iZWdpbigpICsgRiwgT3AuYmVnaW4oKSArIChMLTEpKTsKCglpZiAoT0Muc2l6ZSgpID09IDApcmV0dXJuIGZhbHNlOwoKCXN0ZDo6dWludDY0X3QgQSA9IENhbGMoREMsIE9DKTsKCUQuZXJhc2UoRC5iZWdpbigpICsgRiwgRC5iZWdpbigpICsgTCk7CglELmluc2VydChELmJlZ2luKCkgKyBGLCBBKTsKCU9wLmVyYXNlKE9wLmJlZ2luKCkgKyBGLCBPcC5iZWdpbigpICsgKEwgLSAxKSk7CgoJcmV0dXJuIHRydWU7Cn0KCmJvb2wgTWFrZUhvZ2VPbmUoRFR5cGUgRCwgc3RkOjp1aW50NjRfdCBBKSB7CglEVHlwZSBPcDsKCURUeXBlIERvdWJsZTsKCURUeXBlIEVyYXNlcjsKCglEVHlwZSBUOwoKCXN0ZDo6c29ydChELmJlZ2luKCksIEQuZW5kKCkpOwoKCWRvIHsKCgkJRG91YmxlLmNsZWFyKCk7CgkJRG91YmxlLnJlc2l6ZShELnNpemUoKSk7CgoKCQlkbyB7CgkJCUVyYXNlci5jbGVhcigpOwoJCQlFcmFzZXIucmVzaXplKEQuc2l6ZSgpKTsKCQkJd2hpbGUgKEFkZERpZGl0KEVyYXNlciwgMik9PWZhbHNlKSB7CgkJCQlEVHlwZSBEbyA9IERvdWJsZTsKCQkJCVQgPSBQcmUoRCwgRG8sIEVyYXNlcik7CgkJCQlPcC5jbGVhcigpOwoJCQkJaWYgKFQuc2l6ZSgpICE9IDApIHsKCQkJCQlPcC5yZXNpemUoVC5zaXplKCkgLSAxKTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJaWYgKFQuc2l6ZSgpID09IDEpIHsKCQkJCQlpZiAoVFswXSA9PSBBKSB7CgkJCQkJCVNob3coRCwgRG91YmxlICwgT3AsRXJhc2VyLCAwLCAwKTsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQl9CgkJCQlmb3IgKHN0ZDo6dWludDY0X3QgRiA9IDA7IEYgPCBULnNpemUoKTsgRisrKSB7CgkJCQkJZm9yIChzdGQ6OnVpbnQ2NF90IEw9IEY7IEwgPCBULnNpemUoKTsgTCsrKSB7CgkJCQkJCWRvIHsKCQkJCQkJCS8vUHJvc2Vzc0tha2tvKFQsIE9wLCBGLCBMKTsKCQkJCQkJCWlmIChDYWxjKFQsIE9wKSA9PSBBKSB7CQoJCQkJCQkJCVNob3coRCwgRG91YmxlICwgT3AsRXJhc2VyLCBGLCBMKTsKCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQkJCX0KCQkJCQkJfSB3aGlsZSAoQWRkRGlkaXQoT3AsIDQpPT1mYWxzZSk7CgkJCQkJfQoJCQkJfQoJCQl9IDsKCQl9IHdoaWxlIChBZGREaWRpdChEb3VibGUsIDgpID09IGZhbHNlKTsKCgoJfSB3aGlsZSAoc3RkOjpuZXh0X3Blcm11dGF0aW9uKEQuYmVnaW4oKSwgRC5lbmQoKSkpOwoKCXJldHVybiBmYWxzZTsKfQoKYm9vbCBNYWtlSG9nZShEVHlwZSBEKSB7CgoJZm9yIChzdGQ6OnNpemVfdCBpID0gMTsgTWFrZUhvZ2VPbmUoRCwgaSk7IGkrKyk7CgoJcmV0dXJuIHRydWU7Cn0KCmludCBtYWluKCkgewoJRFR5cGUgRHsgMyw1LDcgfTsKCi8vCU1ha2VIb2dlT25lKEQsMSk7Ci8vCU1ha2VIb2dlT25lKEQsMik7CglNYWtlSG9nZShEKTsKCXJldHVybiAwOwp9