// // main.cpp // Potyczki 2016 jedynki // // Created by Sebastian Skalacki on 23.11.2016. // Copyright © 2016 Sebastian Skalacki. All rights reserved. // #include <iostream> using namespace std; struct Step { static const char* COMPONENT[]; char oper; const char* component; }; class Runner { const int MAX_LENGTH = 100; int k, length; string result; string prefix; inline bool empty() { return result.empty(); } inline void check_too_long(); inline bool try_times(int, Step& step); inline bool try_add_1(Step& step); void recur(); public: void go(); }; void Runner::go() { cin >> k; length = 0; result.clear(); result.reserve(2000); prefix.clear(); prefix.reserve(200); try { recur(); cout << prefix << result; } catch(...) { cout << "NIE"; } cout << endl; } void Runner::recur() { Step step; try_times(2, step) || try_times(3, step) || try_times(5, step) || try_add_1(step); if (result.empty()) { result += step.component; } else if (step.oper == '*') { prefix += "("; result += ")"; result += step.oper; result += "("; result += step.component; result += ")"; } else { result += step.oper; result += step.component; } } bool Runner::try_times(int n, Step &step) { if (k % n){ return false; } const char* component = Step::COMPONENT[n]; k /= n; length += n; check_too_long(); if (k > 1) { recur(); } step.oper = '*'; step.component = component; return true; } bool Runner::try_add_1(Step &step) { k -= 1; length += 1; check_too_long(); if (k > 1) { recur(); } step.oper = '+'; step.component = "1"; return true; } void Runner::check_too_long() { if (length > MAX_LENGTH) { throw "too long"; } } const char* Step::COMPONENT[] = { "", "1", "1+1", "1+1+1", "1+1+1+1", "1+1+1+1+1" }; int main(int argc, const char **argv) { int t; Runner runner; for (cin >> t ; t > 0 ; t--) { runner.go(); } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | // // main.cpp // Potyczki 2016 jedynki // // Created by Sebastian Skalacki on 23.11.2016. // Copyright © 2016 Sebastian Skalacki. All rights reserved. // #include <iostream> using namespace std; struct Step { static const char* COMPONENT[]; char oper; const char* component; }; class Runner { const int MAX_LENGTH = 100; int k, length; string result; string prefix; inline bool empty() { return result.empty(); } inline void check_too_long(); inline bool try_times(int, Step& step); inline bool try_add_1(Step& step); void recur(); public: void go(); }; void Runner::go() { cin >> k; length = 0; result.clear(); result.reserve(2000); prefix.clear(); prefix.reserve(200); try { recur(); cout << prefix << result; } catch(...) { cout << "NIE"; } cout << endl; } void Runner::recur() { Step step; try_times(2, step) || try_times(3, step) || try_times(5, step) || try_add_1(step); if (result.empty()) { result += step.component; } else if (step.oper == '*') { prefix += "("; result += ")"; result += step.oper; result += "("; result += step.component; result += ")"; } else { result += step.oper; result += step.component; } } bool Runner::try_times(int n, Step &step) { if (k % n){ return false; } const char* component = Step::COMPONENT[n]; k /= n; length += n; check_too_long(); if (k > 1) { recur(); } step.oper = '*'; step.component = component; return true; } bool Runner::try_add_1(Step &step) { k -= 1; length += 1; check_too_long(); if (k > 1) { recur(); } step.oper = '+'; step.component = "1"; return true; } void Runner::check_too_long() { if (length > MAX_LENGTH) { throw "too long"; } } const char* Step::COMPONENT[] = { "", "1", "1+1", "1+1+1", "1+1+1+1", "1+1+1+1+1" }; int main(int argc, const char **argv) { int t; Runner runner; for (cin >> t ; t > 0 ; t--) { runner.go(); } return 0; } |