题目:略。
问题分析:题目考察的是a的b次方除以p的余数,由于数据范围较大,不能先计算出a的b次再进行模运算,可以利用模运算的性质:(a*a)%p=((a%p)*(a%p))%p,来进行计算。(个人感觉没有直接用(a*a)%p好理解)
解题整体思路:我们可以借助二进制的算法来优化一下整体思路,思路如下:将b转化为二进制数,算出转换后的二进制数。(具体思路详见信息学奥林匹克竞赛实战笔记A册P350)
万事中有但是。但是,我有一种更容易理解的算法。
me的完整代码如下:
#include<bits/stdc++.h>
using namespace std;
int arr[35];
int lens=0; //将num转换成二进制数,存储在数组arr中
void zhuanhuan(int num){
while(num>0){
arr[++lens]=num%2;
num/=2;
}
} //前一项的值=后一项的平方
int main(){
int a,b,p;
cin>>a>>b>>p;
zhuanhuan(b);
long long ans=1; //表示结果
long long x=a; //x:存储a的i次方的值
for(int i=1;i<=lens;i++){
if(arr[i]==1){ //二进制为一时,说明有该位;否则表示没有该位
ans=(ans*x)%p;
}
//改变下一项的值
x=(x*x)%p;
}
ans=ans%p;
cout<<a<<"^"<<b<<" mod "<<p<<"="<<ans;
return 0;
}
本文介绍了如何避免直接计算大数次方后取模的困难,通过将指数转换为二进制并利用模运算的性质,结合递归实现a的b次方对p取余的高效算法。作者还提供了C++代码示例。
764





