题目大意是输入一个数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 ",pow(n,n)); } return 0; }