B题正如题目所言,用快速幂取余:
把b转换成二进制数。
该二进制数第i位的权为
例如
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算
其中,if(b&1)用于判断当前b最低位是否为1
b<<=1用于让b左移一位
由于积的最低位只由乘数的最低位影响,所以每次都只保留最低位,即%10,这样可以避免数过大溢出。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
#define INF 10010
using namespace std;
int solve(int a,int b){
int ans=1;
a=a%10;
while(b){
if(b&1) ans=(ans*a)%10;
a=(a*a)%10;
b>>=1;
}
return ans;
}
int main(){
int a,b;
while(~scanf("%d%d",&a,&b)) printf("%d\n",solve(a,b));
return 0;
}