Advertisement
Guest User

Untitled

a guest
Nov 5th, 2011
314
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.59 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <cstdint>
  3. #include <iostream>
  4. #include <map>
  5. using namespace std;
  6. template <typename ack_t>
  7. struct ack_arg {
  8. ack_t m, n;
  9. ack_arg(ack_t m_, ack_t n_) : m(m_), n(n_)
  10. {}
  11. bool operator<(ack_arg<ack_t>& aa){
  12. if (aa == *this)
  13. return false;
  14. return (m < aa.m || n < aa.n);
  15. }
  16. bool operator>(ack_arg<ack_t>& aa){
  17. if (aa == *this)
  18. return false;
  19. return (m > aa.m || n > aa.n);
  20. }
  21. bool operator<=(ack_arg<ack_t>& aa){
  22. return !(*this > aa);
  23. }
  24. bool operator>=(ack_arg<ack_t>& aa){
  25. return !(*this < aa);
  26. }
  27. bool operator==(ack_arg<ack_t>& aa){
  28. if (aa == *this)
  29. return true;
  30. return (m == aa.m || n == aa.n);
  31. }
  32. };
  33.  
  34. ostream& operator<<(ostream& o, ack_arg<uintmax_t>* a){
  35. o << a->m <<"," << a->n;
  36. return o;
  37. }
  38. map<ack_arg<uintmax_t>*, uintmax_t> memo;
  39. uintmax_t ack(ack_arg<uintmax_t>* a) {
  40. //      cout << a << endl;
  41.         if (memo.find(a) != memo.end())
  42.                 return memo[a];
  43.         if (a->m==0) {
  44.                 memo[a] = a->n + 1;
  45.                 return memo[a];
  46.         }
  47.         else if (a->m > 0 && a->n == 0) {
  48.                 memo[a] = ack(new ack_arg<uintmax_t>(a->m-1,1));
  49.                 return memo[a];
  50.         } else if (a->m > 0 && a->n > 0) {
  51.  
  52.                 memo[a] = ack(new ack_arg<uintmax_t>(a->m-1,ack(new ack_arg<uintmax_t>(a->m,a->n-1))));
  53.                 return memo[a];
  54.         }
  55. }
  56. int main(int argc, char **argv) {
  57.         memo = map<ack_arg<uintmax_t>*, uintmax_t>();
  58.         std::cout << ack(new ack_arg<uintmax_t>(strtoull(argv[1], (char**)NULL, 10), strtoull(argv[2], (char**)NULL, 10))) << std::endl;
  59.         return 0;
  60. }
  61.  
  62.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement