啊啊啊啊啊啊啊啊啊,数学原理对于我来说真的很难,写写博客帮助自己学习,要嘎了——
好,出现吧,我的AC代码!!!
#include <bits/stdc++.h>
using namespace std;
long long a,b,p,ans,base;
long quickpower(long a,long b,long p)
{
ans=1,base=a;
while(b>0)
{
if(b&1)
{
ans*=base;
ans%=p;
}
base*=base;
base%=p;
b>>=1;
}
return ans;
}
int main()
{
cin>>a>>b>>p;
cout<<a<<'^'<<b<<" mod "<<p<<'='<<quickpower(a,b,p);
return 0;
}
首先先学习一下快速乘方这个步骤,要求a的b次方,我们这里要用到位运算,贴个代码——
int puickPower(int a,int b) //求a的b次方
{
int ans=1,base=a; //ans为答案,base为a^(2^n)
while(b>0)
{
if(b&1) //&是位运算,b&1表示b在二进制下是不是1
ans*=base; //符合条件就乘以对应位置的base
base*=base; //base自乘
b>>=1; //右移一位
}
return ans;
}
乘方的步骤就是如此,咱们再来看取余——
一些取余运算公式:
(A+B) mod b = (A mod b + B mod b) mod b
(A×B) mod b=((A mod b)×(B mod b)) mod b
while(b > 0)
{
if(b & 1)
{
ans *= base;
ans %= m;
}
base *= base;
base %= m;
b >>= 1;
}
这里ans只是负责存储答案,真正在运算的是base,所以base在不断取余呢。
ok,我觉得大家应该可以理解了,题目AC代码就在上面。
就酱紫,挥挥~