这道题呢会用到一个知识点叫做“快速幂”,那我们先简单认识一下快速幂吧;
快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
把b转换成2进制数
该2进制数第i位的权为(2^(i-1))
例如
a^11=a^(2^0+2^1+2^3)
11的二进制是1 0 1 1
11 = 2^3*1 + 2^2*0 + 2^1*1 + 2^0*1
因此,我们将a^11转化为算a^(2^0)*a^(2^1)*a^(2^3)[1]
以下为代码:
int pow3( int a, int b )
{
int r = 1, base = a;
while( b != 0 )
{
if( b & 1 )
r *= base;
base *= base;
b >>= 1;
}
return r;
}
那么这道题也就只剩下简单的代码啦,话不多说,上程序!
#include<bits/stdc++.h>
using namespace std;
int qp(int n,int k,int p)
{
long long now=n,f=1;
while(k>1)
{
if(k%2==1) k--,f*=now,f%=p;
if(k) now*=now,now%=p,k/=2;
}
return (now*f)%p;
}
int main()
{
long long a,b,p,s,ans; long long i;
cin>>a>>b>>p;
cout<<a;cout<<'^';cout<<b;
a%=p; ans=a;
cout<<" mod "<<p<<"="<<qp(a,b,p);
return 0;
}
那么这期就到这啦,下期再见,拜拜。