Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdlib>
- #include <cstdint>
- #include <iostream>
- #include <map>
- using namespace std;
- template <typename ack_t>
- struct ack_arg {
- ack_t m, n;
- ack_arg(ack_t m_, ack_t n_) : m(m_), n(n_)
- {}
- bool operator<(ack_arg<ack_t>& aa){
- if (aa == *this)
- return false;
- return (m < aa.m || n < aa.n);
- }
- bool operator>(ack_arg<ack_t>& aa){
- if (aa == *this)
- return false;
- return (m > aa.m || n > aa.n);
- }
- bool operator<=(ack_arg<ack_t>& aa){
- return !(*this > aa);
- }
- bool operator>=(ack_arg<ack_t>& aa){
- return !(*this < aa);
- }
- bool operator==(ack_arg<ack_t>& aa){
- if (aa == *this)
- return true;
- return (m == aa.m || n == aa.n);
- }
- };
- ostream& operator<<(ostream& o, ack_arg<uintmax_t>* a){
- o << a->m <<"," << a->n;
- return o;
- }
- map<ack_arg<uintmax_t>*, uintmax_t> memo;
- uintmax_t ack(ack_arg<uintmax_t>* a) {
- // cout << a << endl;
- if (memo.find(a) != memo.end())
- return memo[a];
- if (a->m==0) {
- memo[a] = a->n + 1;
- return memo[a];
- }
- else if (a->m > 0 && a->n == 0) {
- memo[a] = ack(new ack_arg<uintmax_t>(a->m-1,1));
- return memo[a];
- } else if (a->m > 0 && a->n > 0) {
- memo[a] = ack(new ack_arg<uintmax_t>(a->m-1,ack(new ack_arg<uintmax_t>(a->m,a->n-1))));
- return memo[a];
- }
- }
- int main(int argc, char **argv) {
- memo = map<ack_arg<uintmax_t>*, uintmax_t>();
- std::cout << ack(new ack_arg<uintmax_t>(strtoull(argv[1], (char**)NULL, 10), strtoull(argv[2], (char**)NULL, 10))) << std::endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement