coding=utf-8:

while 1:
try:
def rid(nu):
num=''.join(nu)
i,n,re=0,len(num),[]
while i<n:
if num[i]=='(':#寻找最深处的括号,如K4(ON(SO3)2)2的(SO3)
if re==[]:
re.append(i)
else:
re=[i]
elif num[i]==')':
re.append(i)
break
i+=1
if re!=[]:
f,k='',re[1]+1
if re[1]+1<len(num):
while ord(num[k])>=48 and ord(num[k])<=57:#判断括号外边有没有系数f,如(SO3)2的f=2
f+=num[k]
k+=1
if k==len(num):
break
if f=='':
f=1
f=int(f)#有系数直接每一项乘以f
j,nj,nn=0,[],num[re[0]+1:re[1]]#摘出最深处括号里的内容
while j<len(nn):#通过大写字母区分每个原子项
if ord(nn[j])>=65 and ord(nn[j])<=90:
nj.append(j)
j+=1
if nj[-1]==len(nn)-1:
nn+='1'
nj.append(len(nn))
j,r=0,[]
while len(nj)>1:#一个原子一个原子进行数数
if ord(nn[nj[0]+1])>=97 and ord(nn[nj[0]+1])<=122:#含小写字母的原子,如Mg
if nj[0]+2==nj[1]:#只有1个原子情况后面没有系数,系数应该为1,要补上
if nn[nj[0]:nj[0]+2] in r:#判断是否有重复项,有就直接合并
r[r.index(nn[nj[0]:nj[0]+2])+1]+=1f
else:
r.append(nn[nj[0]:nj[0]+2])
r.append(1
f)
else:#有大于1个原子的情况,后面系数直接乘以f然后加上
if nn[nj[0]:nj[0]+2] in r:
r[r.index(nn[nj[0]:nj[0]+2])+1]+=int(nn[nj[0]+2:nj[1]])f
else:
r.append(nn[nj[0]:nj[0]+2])
r.append(int(nn[nj[0]+2:nj[1]])
f)
else:#只有大写字母的原子,如O
if nj[0]+1==nj[1]:#只有1个原子情况后面没有系数,系数应该为1,要补上
if nn[nj[0]:nj[0]+1] in r:#判断是否有重复项,有就直接合并
r[r.index(nn[nj[0]:nj[0]+1])+1]+=1f
else:
r.append(nn[nj[0]:nj[0]+1])
r.append(1
f)
else:#有大于1个原子的情况,后面系数直接乘以f然后加上
if nn[nj[0]:nj[0]+1] in r:
r[r.index(nn[nj[0]:nj[0]+1])+1]+=int(nn[nj[0]+1:nj[1]])f
else:
r.append(nn[nj[0]:nj[0]+1])
r.append(int(nn[nj[0]+1:nj[1]])
f)
del nj[0]#判断一个原子完就删除
if num.count('(')==1:
rs,g,d=[],0,len(r)
while g<d-1:
rs.append([r[g],r[g+1]])
g+=2
rs.sort()
r=[]
for rss in rs:
r.append(rss[0])
r.append(rss[1])
while 1 in r:
r.remove(1)
r=[str(i) for i in r]
r=''.join(r)#合并成字符串
del nu[re[0]:k]#对于还有括号一种,直接替换,如用S2O6替换(SO3)2
nu.insert(re[0],r)#替换
nu=''.join(nu)
return nu
nus='('+input()+')1'
while '(' in nus:#不断重复
nun=list(nus)
nus=rid(nun)
print(nus)
except:
break