题解B2144【阿克曼(Ackmann)函数】
WanderingTrader · · 题解
从对函数的定义可以看出,这个函数的计算需要使用递归。直接按照定义来写即可。
#include <bits/stdc++.h>
using namespace std;
int n,m;
int a(int m,int n) // akm(m,n)
{
if(m==0) return n+1;
if(m>0&&n==0) return a(m-1,1);
if(m>0&&n>0) return a(m-1,a(m,n-1));
}
int main()
{
scanf("%d%d",&m,&n);
cout<<a(m,n);
return 0;
}
通过一些测试数据可以看出,阿克曼的函数增长的非常快,因此它的反函数,即反阿克曼函数增长的非常慢。使用路径压缩的并查集单次操作均摊时间复杂度为
对于
\forall n\le2^{2^{10^{19729}}} ,都有a(n)<5 ——《进阶指南》