#include <cstdio>
#include <iostream>
#include <vector>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <string>
#include <cstring>
#include <sstream>
#include <algorithm>
#include <functional>
#include <queue>
#include <stack>
#include <cmath>
#include <iomanip>
#include <list>
#include <tuple>
#include <bitset>
#include <ciso646>
#include <cassert>

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<ll, ll> P;
typedef tuple<ll, ll, ll> T;
typedef vector<ll> vec;

inline bool check(ll x, ll y, ll xMax, ll yMax) { return x >= 0 && y >= 0 && xMax > x && yMax > y; }
inline int toint(string s) { int v; istringstream sin(s); sin >> v; return v; }
template<class T> inline string tostring(T x) { ostringstream sout; sout << x; return sout.str(); }
template<class T> inline T sqr(T x) { return x*x; }
template<class T> inline T mypow(T x, ll n) { T res = 1; while (n > 0) { if (n & 1)res = res * x;	x = x * x;	n >>= 1; }return res; }
inline ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
inline ll lcm(ll a, ll b) { return a / gcd(a, b) * b; }

#define For(i,a,b)	for(ll (i) = (a);i < (b);(i)++)
#define rep(i,n)	For(i,0,n)
#define rFor(i,a,b)	for(ll (i) = (a-1);i >= (b);(i)--)
#define rrep(i,n)	rFor(i,n,0)
#define each(i,n)	for(auto &i : n)
#define clr(a)		memset((a), 0 ,sizeof(a))
#define mclr(a)		memset((a), -1 ,sizeof(a))
#define all(a)		(a).begin(),(a).end()
#define sz(a)		(sizeof(a))
#define tostr(a)	tostring(a)
#define dump(val) 	cerr << #val " = " << val << endl;
#define Fill(a,v)	fill((int*)a,(int*)(a+(sz(a)/sz(*(a)))),v)

const ll dx[8] = { 1, 0, -1, 0, 1, 1, -1, -1 }, dy[8] = { 0, -1, 0, 1, -1, 1, -1, 1 };

const ll mod = 1e9 + 7;
const ll INF = 1e13 + 9;

#define int ll
#define double ld

signed main() {
	cin.tie(0);
	ios_base::sync_with_stdio(false);
	
	string s; int I;
	while (cin >> s >> I && s != "0") {
		struct node {
			int sum;
			vector<int> to;
			string s;
		};
		s = s + ")";
		{
			map<int, string, greater<int>> add;
			rep(i, s.size()) {
				if (s[i] >= 'A' && s[i] <= 'Z') {
					if (i == 0 || !(s[i - 1] >= '0' && s[i - 1] <= '9')) {
						add[i] = "1(";
					}
					else {
						add[i] = "(";
					}

				}
			}
			each(i, add) {
				s = s.substr(0, i.first) + i.second + s.substr(i.first);
			}
		}
		{
			map<int, string, greater<int>> add;
			rep(i, s.size()) {
				if (s[i] >= 'A' && s[i] <= 'Z') {
					add[i+1] = ")";
				}
			}
			each(i, add) {
				s = s.substr(0, i.first) + i.second + s.substr(i.first);
			}
		}
		vector<node> nd;
		nd.push_back(node());
		function<int(int, int)> make_node = [&](int n, int t) {
			int sn = n;
			while (s[n] >= 'A' && s[n] <= 'Z') {
				nd[t].s.push_back(s[n]); n++;
			}
			nd[t].sum = nd[t].s.size();
			for (;; n++) {
				if (s[n] == '(') {
					int tp = toint(s.substr(sn, n - sn));
					nd.push_back(node());
					int tt = nd.size() - 1;
					n = make_node(n + 1, tt);
					nd[tt].sum *= tp;
					nd[tt].sum = min(INF, nd[tt].sum);
					nd[t].sum += nd[tt].sum;
					nd[t].sum = min(INF, nd[t].sum);
					nd[t].to.push_back(tt);
					sn = n + 1;
					continue;
				}
				if (s[n] == ')') {
					return n;
				}
			}
		};
		make_node(0, 0);

		function<char(int, int)> search = [&](int t,int c) {
			if (nd[t].s.size()) {
				c %= nd[t].s.size();
				return nd[t].s[c];
			}
			while (1) {
				each(to, nd[t].to) {
					if (nd[to].sum > c) {
						return search(to, c);
					}
					c -= nd[to].sum;
				}
			}
		};
		if (nd[0].sum <= I) {
			cout << 0 << endl;
		}
		else {
			cout << search(0, I) << endl;
		}
	}

	return 0;
}

Measured memory_bytes: 3164