http://acm.hdu.edu.cn/showproblem.php?pid=1163
这道题目本来没有看到 n ^ n ,所以直接写,TLE了,但是突发奇想,能不能在n 累乘的过程中,直接求出各位数值和,在继续乘以 n ,直到 乘了n次;但是没有搞懂原理,后来问了dogdog,才知道了原理;
假设 前两位大于10 相乘为ab(因为有一项满足,其余的肯定也能通过同一个原理证明出来);利用数值表示就为 10 * a + b ;
现在有( 1 0 * a + b ) * ( 10 * a + b ) ==100 * a * a + 20 * a * b + b * b ,在这里因为我们求得是他各位数值和,因此只需要a * a + 2 * a * b + b * b ;同样累积到最后一项,仍然只需要考虑 a b 即可;所以这种原理可以;
另外还可以利用二分法,从两边同时进行,可以效率 , 因为两边都是对称(因为都是n * n * .......* n * n ;
#include<iostream>
#include<cstdio>
using namespace std;
#define INT __int64
int Sum( INT n )
{
INT sum = 0 ;
while( n )
{
sum += n % 10 ;
n /= 10 ;
}
return sum ;
}
int main()
{
INT n , sum ;
INT i , j , k ;
while( scanf( "%I64d" , &n ) != EOF && n )
{
INT tempn = 1 ;
INT b = n ;
while( b-- )
{
tempn *= n ;
tempn = Sum( tempn ) ;
}
sum = Sum( tempn ) ;
while( sum > 9 )
sum = Sum( sum ) ;
printf( "%I64d\n" ,sum ) ;
}
return 0 ;
}