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;
}
本文介绍了一种高效的计算大数幂次取余的方法——快速幂取余算法,并通过具体的例子详细展示了算法的实现过程。文章还提供了一个C++代码示例,用于计算a的b次方除以10的余数。
1846

被折叠的 条评论
为什么被折叠?



