program#
#include <bits/stdc++.h>
using namespace std;
// ackの計算(履歴保存)
int ack_calc(vector<vector<int>> &ack_process) {
int step = ack_process.size() - 1; // 現在のステップ数を求める
int depth = ack_process.at(step).size() - 1; // 再帰の深さ
if (depth == 0) {
return ack_process.at(step).at(0);
} else if (ack_process.at(step).at(depth - 1) == 0) { // m=0 のとき
vector<int> add_vector(depth); // 履歴は1少ない
ack_process.push_back(add_vector);
for (int i = 0; i < depth - 1; i++) {
ack_process.at(step + 1).at(i) =
ack_process.at(step).at(i); // 次の行の一番最後以外は同じ
}
ack_process.at(step + 1).at(depth - 1) = ack_process.at(step).at(depth) + 1;
return ack_calc(ack_process);
} else if (ack_process.at(step).at(depth) == 0) { // n = 0 のとき
vector<int> add_vector(depth + 1); // 履歴の数は同じ
ack_process.push_back(add_vector);
for (int i = 0; i < depth - 1; i++) {
ack_process.at(step + 1).at(i) =
ack_process.at(step).at(i); // 次の行の最後2つ以外は同じ
}
ack_process.at(step + 1).at(depth - 1) =
ack_process.at(step).at(depth - 1) - 1; // 次はm-1
ack_process.at(step + 1).at(depth) = 1; // 一番最後は1
return ack_calc(ack_process);
} else {
vector<int> add_vector(depth + 2); // 履歴の数は1増える
ack_process.push_back(add_vector);
for (int i = 0; i < depth - 1; i++) {
ack_process.at(step + 1).at(i) =
ack_process.at(step).at(i); // 次の行の最後3つ以外は同じ
}
ack_process.at(step + 1).at(depth - 1) =
ack_process.at(step).at(depth - 1) - 1; // 次はm-1
ack_process.at(step + 1).at(depth) =
ack_process.at(step).at(depth - 1); // その次はm
ack_process.at(step + 1).at(depth + 1) =
ack_process.at(step).at(depth) - 1; // 最後はn - 1
return ack_calc(ack_process);
}
}
void print_line(vector<int> &ack_process_l, int depth) {
if (ack_process_l.size() == depth + 1) { // 最後
cout << ack_process_l.at(depth);
} else {
cout << "Ack(" << ack_process_l.at(depth) << ", ";
print_line(ack_process_l, depth + 1); // 1深いところに再帰
cout << ")";
}
}
int main() {
int m, n;
cin >> m >> n;
// 過程の格納
vector<vector<int>> ack_process(1, vector<int>(2, 0));
ack_process.at(0).at(0) = m;
ack_process.at(0).at(1) = n;
cout << ack_calc(ack_process) << endl;
int steps = ack_process.size();
for (int i = 0; i < steps; i++)
{
if (i != 0) {
cout << "=";
}
print_line(ack_process.at(i), 0);
cout << endl;
}
return 0;
}