题目大意是输入一个数N,输出N的N次方的个位,N非常大,直接算会非常慢,所以用二分求幂,即分治,和二分查找思想类似,几乎每次将规模缩小一半,将复杂度由O(n)降到了O(logn),另外,n*n%m=(n%m)*(n%m)%m
#include <stdio.h>
__int64 pow(__int64 n,__int64 m)
{
__int64 u;
if(m==1)
return n%10;
if(m%2==0)
{
u=pow(n,m/2)%10;
return u*u%10;
}
else
{
u=u=pow(n,m/2)%10;
return n%10*u*u%10;
}
}
int main()
{
__int64 n;
int m,i;
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%I64d",&n);
printf("%I64d\n",pow(n,n));
}
return 0;
}