1 #include<iostream>
2 #include<cstring>
3 #include<string>
4 #include<algorithm>
5
6 using namespace std;
7
8 #define ll long long
9
10 int ans[200], alen = 0; //结果和结果的长度
11 int b[1005]; //temp数组
12 int p; //更新i的工具
13 char s[20005];
14 int k; //存储字符串数组及其长度
15
16 void add(int b[], int len) {//高精度加
17 alen = max(alen, len); //b的长度和ans长度取最大值
18 for (int i = 1; i <= alen; i++) {
19 ans[i] += b[i];
20 ans[i+1] += ans[i] / 10;
21 ans[i] %= 10;
22 }
23 if (ans[alen+1]) alen++; //如果最高位有进位,则长度++
24 }
25
26 void mi(ll n) { //2的高精度幂
27 memset(b, 0, sizeof(b));
28 b[1] = 1;
29 int len = 1;
30 for (int i = 1; i <= n; i++) {
31 int temp = 0; //进位
32
33 //相当于一次ans * 2, n次幂,所以i循环n次
34 for (int j = 1; j <= len; j++) {
35 b[j] = b[j] * 2 + temp;
36 temp = b[j] / 10;
37 b[j] %= 10;
38 if (temp != 0 && j == len) len++; //如果最高位有所进位,那么长度加1,多进行一次循环
39 }
40 }
41
42 add(b, len); //计算的结果需要加到ans结果中
43 }
44
45 ll ksm (ll a, ll b) { //普通快速幂
46 ll ans = 1;
47 for (; b; b >>= 1) {
48 if (b & 1) ans *= a; //b为奇数,先进行一次乘
49 a *= a;
50 }
51 return ans;
52 }
53
54 ll dfs(ll start, ll num_kuo) {
55 ll sum = 0;
56 p = 0;
57 // p = start;
58 for (int i = start; i < k; i++) {
59 p = max(p, i); //每次更新一下p
60 if (s[i] == '(') num_kuo++;
61 if (s[i] == ')') num_kuo--;
62 if (!num_kuo) { //如果括号结束
63 mi(sum); //那么对sum进行一次高度幂
64 return 0;
65 }
66 if (s[i] == ')') return ksm(2, sum); //如果是括号里的括号,那么使用普通快速幂就可
67 if (s[i] == '2') {
68 if (s[i+1] == '(') {
69 sum += dfs(i+1, num_kuo);
70 i = p;
71 }
72 else
73 sum += 2;
74 }
75 }
76 }
77
78 int main() {
79 scanf("%s", s);
80 k = strlen(s);
81 for (int i = 0; i < k; i++) {
82 if (s[i] == '2') {
83 if (s[i+1] != '(') { //如果i+1不是括号,代表仅有2,那便直接加2
84 memset(b, 0, sizeof(b));
85 b[1] = 2;
86 add(b, 1);
87 }
88 else {
89 dfs(i+1, 0);
90 i = p; //递归完需要借助p来更新i
91 }
92 }
93 }
94
95 for (int i = alen; i >= 1; i--) {
96 printf("%d", ans[i]);
97 }
98 return 0;
99 }