P1226
本题不能直接进行计算,否则为24分
代码如下
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,p;
cin>>a>>b>>p;
long long sum=pow(a,b);
sum%=p;
cout<<a<<"^"<<b<<" mod "<<p<<"="<<sum;
return 0;
}
那么我们可以应用以下公式
(b*b)=((b%k)*(b%k))%k
进行计算(二进制)
#include<bits/stdc++.h>
using namespace std;
int arr[35];
int lens=0;
void convert(int sum){//转换二进制数
while(sum>0){
arr[++lens]=sum%2;
sum/=2;
}
}
int main(){
int a,b,p;
cin>>a>>b>>p;
convert(b);
long long ans=1;
long long x=a;
for(int i=1;i<=lens;i++){
if(arr[i]==1){
ans=(ans*x)%p;//判断二进制为1,说明有该位
}
x=(x*x)%p;//不管二进制数是否为1,都要进行计算
}
ans=ans%p;
cout<<a<<"^"<<b<<" mod "<<p<<"="<<ans;
return 0;
}
x是计算二进制中每一位的数值
因为二进制中相邻两位实际相差为x的平方