Problem 188
winxos 2010-1-26
04 April 2008
The hyperexponentiation or tetration of a number a by a positive integer b, denoted by a↑↑b or ba, is recursively defined by:
a↑↑1 = a,
a↑↑(k+1) = a(a↑↑k).
Thus we have e.g. 3↑↑2 = 33 = 27, hence 3↑↑3 = 327 = 7625597484987 and 3↑↑4 is roughly 103.6383346400240996*10^12.
Find the last 8 digits of 1777↑↑1855.
从这个超级指数题目中,领悟了非常强大的东西,指数的任意次任意阶的首位和末位几位都不是问题。
首先我们对递归函数进行分析,得到所谓的ba就是将a进行b次的指数计算。
很明显,这个级数有着可怕的增长,比如说有名的这个结果就是没有办法计算的。
现在题目要求很明显是无法求到精确解的,但是注意到只用求最后8位,顶多有10^8种情况,所以并不可怕,关键在于发现规律。
一个数的n次方的尾数肯定是不可以取到所有的数的,比如说一个奇数的任意次方不可能得到偶数的尾数,所以我们可以去掉大量的重复情况,
我们编程分析一下,很容易发现1777的次方尾数后8位每隔1250000就循环了,相当于只能取到1/80的解,这样我们可以先求出这1250000个尾数,然后查表依次做就可以了,具体步骤为:先求1777^1777的后8位,然后%1250000得到数n,就表示1777^1777^1777的尾数8位==1777^n,依次就可以算出;
C++ 代码如下:运行时间T2370 100ms左右。
#define BASE 100000000 |
int mp[1250001]; |
void init188() |
{ |
mp[0]=1; |
long long n=1; |
for (int i=1;i<1250001;i++) |
{ |
n*=1777; |
mp[i] = (n>=BASE?n%=BASE:n); |
} |
} |
int e188() |
{ |
init188(); |
int t=mp[1777]; |
for (int i=1;i<1854;i++) |
{ |
t=mp[t%1250000]; |
} |
cout<<t<<endl; |
return 0; |
} |
转载于:https://blog.51cto.com/winxos/330868