简要思路:
a的b次方如果用编程解决,最基础的就是采用循环,这个时间复杂度是o(b),当b比较大的时候,会超时。所以我们要考虑较少程序换此数
3^274=(3*3)^137 = (9*9)^68*9=(81*81)^34*9=。。。。。。=最后是1
函数中的循环可以把时间控制到O(log2k)
但最后的得数会很大 可能空间存不下来
这时候答案一般都让我们求余数
可以用同余定理在每一次循环过后都给a求成余数就可以了
这个过程就像是a在不停地乘方变大,然后其中因为幂是奇数多出来的单独领出来乘ans最后最后当幂变为1时,a也*ans,ans就是领出来的*a,其中每一项都是p的模
其实每次除以2的过程就是二进制数移位的过程,如果位1的话直接走if后面的,如果是0的话就走if里面的,所以我们也可以吧b当做二进制数来做
思路理清了 开干 塔塔开!塔塔开!塔塔开!!!!!!!
代码:
#include <iostream>
using namespace std;
int a,b,p;
typedef long long LL;
int power(int a, int b,int p){
int ans=1;
while(b){
if(b%2)ans=(LL)ans*a%p;
a=(LL)a*a%p;
b=b/2;
}
return ans;
}
int main(){
scanf("%d%d%d",&a,&b,&p);
printf("%d^%d mod %d=%d",a,b,p,power(a,b,p));
return 0;
}