hdu 1061 Rightmost Digit

题目大意是输入一个数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;
}


 

原文地址:https://www.cnblogs.com/vermouth/p/3710234.html