数论基础题 核心是“同余幂”算法 即求a^b mod m(a的b次方整除m的余数)的算法 本题中恰好m=10
运算时注意:
1.底数不断平方 在指数的二进制位为1的地方 乘入结果 复杂度从O(n)降低至O(log2 n)(以2为底)
2.上述积%m的结果 即乘入数各自%m的余数之积再%m 余数相乘时再不断递归该原理 大大降低空间复杂度
详细数学证明可参考基础数论中关于整除和同余的部分知识
C代码如下:
#include<stdio.h>
int main(){
int a,b,p;
while(~scanf("%d%d",&a,&b)){
p=1,a%=10;
do{
if(b&1)p=(p*a)%10;//b&1等价于b%2==1或b%2
a=(a*a)%10;
}while(b>>=1);//b>>=1等价于b/=2
printf("%d\n",p);
}
}