Ackermann函数
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:122 测试通过:25
总提交:122 测试通过:25
描述
计算Ackermann函数值?天方夜谭吧?
不错,Ackermann函数是增长速度极快的递归函数,要计算其函数值当然是相当困难的。
Ackermann函数定义如下:
本题中我们只需要计算当m=3时Ackermann函数的值
输入
输入包含多组测试数据,每组测试数据占一行,为一个64位整数n
输出
对每组输入的n,请输出Ackermann函数当m=3时的值,也就是A(3,n)。最后结果对9223372036854775807取余。
样例输入
5
10
100
样例输出
253
8189
1099511627773
先写暴力程序(注意数组要开大),之后找规律,递推
暴力程序就按照题目描述写成递归形式即可, 计算前10项就能看出规律了。
#define LL __int64
#define M 9223372036854775807ll
LL f[N];
void init(){
f[0] = 5;
for(int i=1;i<70;i++){
f[i] = (f[i-1]*2+3) % M;
}
f[61] = M - 1;
f[62] = 1;
f[63] = 5;
}
int main(){
init();
LL n;
while(scanf("%I64d",&n)!=EOF){
f[0] = f[63];
printf("%I64d\n",f[n%63]);
}
return 0;
}