#include #include #include #include using namespace std; struct Node { int times; long long size; string str; vector children; Node(int times, const string& s) : times(times), size(times * s.size()), str(s) { if (size >= 100000000000000LL) size = 100000000000000LL; return; } Node(int times, const vector& children) : times(times), size(0), str(), children(children) { // cout << times << "!" << endl; for (int i = 0; i < (int)children.size(); ++i) { size += children[i]->size * times; if (size >= 100000000000000LL) size = 100000000000000LL; } return; } ~Node() { for (int i = 0; i < (int)children.size(); ++i) delete children[i]; return; } char search(int idx) { // cout << idx << ", " << times << ", " << size << ", " << str << '\n'; if (idx >= size) return '0'; if (!str.empty()) return str[idx % str.size()]; int rest = idx % (size/times); //cout << "rest " << rest << endl; for (int i = 0; i < (int)children.size(); ++i) { if (children[i]->size > rest) return children[i]->search(rest); rest -= children[i]->size; } return '0'; } }; Node* parseTerm(const string& s, int& idx); vector parseExpr(const string& s, int& idx) { vector v; while (('0' <= s[idx] && s[idx] <= '9') || ('A' <= s[idx] && s[idx] <= 'Z')) { v.push_back(parseTerm(s, idx)); } return v; } Node* parseTerm(const string& s, int& idx) { // cout << "parseTerm " << s << ", " << idx << endl; int times = 1; if ('0' <= s[idx] && s[idx] <= '9') { int n = 0; while ('0' <= s[idx] && s[idx] <= '9') { n *= 10; n += s[idx++] - '0'; } times = n; } if (s[idx] == '(') { ++idx; vector children = parseExpr(s, idx); assert(s[idx++] == ')'); return new Node(times, children); } else { assert('A' <= s[idx] && s[idx] <= 'Z'); string t; while ('A' <= s[idx] && s[idx] <= 'Z') t += string(1, s[idx++]); return new Node(times, t); } } int main() { while (true) { string s; int idx; cin >> s >> idx; if (s == "0" && idx == 0) break; s += " "; int i = 0; vector v = parseExpr(s, i); Node* root = new Node(1, v); cout << root->search(idx) << '\n'; } return 0; }