什么是快速幂
快速幂:快速求a^k % p的问题,时间复杂度:O(logk),若对于n组数据,那么时间复杂度为O(n∗logk)
暴力做法
解题思路:n组数据,循环k次分别求出a^k%p。时间复杂度为o(n*k) 可能会时间超限。
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int a,k,p;
long long res=1;
cin>>a>>k>>p;
while(k--)
res = res * a %p;
cout<<res<<endl;
}
}
快速幂解法
解题思路:
核心思想:做预处理求出a^2^0 mod p,a^2^1 mod p........a^2^logk mod p;然后将k换成二进制来求a^k的值,时间复杂度o(logk);
#include<iostream>
using namespace std;
typedef long long ll;
int n;
int a,k,p;
int pri(int a,int k,int p)
{
ll res=1;
while(k)//求二进制
{
if(k & 1) res=a*(ll)res % p;//如果k二进制的结尾是1,就将res更新
k>>=1;//删除最后一位
a=(ll)a*a%p;//每次都更新a的值
}
return res;
}
int main()
{
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d",&a,&k,&p);
printf("%d\n",pri(a,k,p));
}
return 0;
}