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就是Euler Project Problem 188_职场将a进行b次的指数计算。

很明显,这个级数有着可怕的增长,比如说有名的Euler Project Problem 188_职场_02这个结果就是没有办法计算的。

现在题目要求Euler Project Problem 188_C++_03很明显是无法求到精确解的,但是注意到只用求最后8位,顶多有10^8种情况,所以并不可怕,关键在于发现规律。

一个数的n次方的尾数肯定是不可以取到所有的数的,比如说一个奇数的任意次方不可能得到偶数的尾数,所以我们可以去掉大量的重复情况,

我们编程分析一下,很容易发现1777的次方尾数后8位每隔1250000就循环了,相当于只能取到1/80的解,这样我们可以先求出这1250000个尾数,然后查表依次做就可以了,具体步骤为:先求1777^1777的后8位,然后%1250000得到数n,就表示1777^1777^1777的尾数8位==1777^n,依次就可以算出Euler Project Problem 188_C++_03

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;
}