快速幂

Posted on 2022-04-06 19:55  ZheyuHarry  阅读(30)  评论(0编辑  收藏  举报

这一部分我们将会讲到数论中的快速幂问题,是用于快速求解a^k%p 的此类问题的;

1<=a,k,p <= 1^9;

解题思路:

我们假设a^k的因式分解可以分解为x1,x2,x3....,xk,ans = (x1%p)(x2%p)....(xk%p);

因为我们如果按照朴素做法肯定要一步步求出a^k,但是这样的话就是O(k)的时间复杂度,很可能会爆时间!

所以我们如果能把k因式分解出来就会很方便,我们发现可以通过把k用二进制表示,分解为2的幂次的乘积,然后我再对于每个2的幂次乘上其%p的值;

这样的话我们就是logk的时间复杂度就会十分简单!

 

我们来看一下代码实现的问题:

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;

LL qmi(int a,int k,int p){
LL res = 1;
while(k){
if(k&1) res = res*a%p;
a = (LL)a*a%p;
k >>= 1;
}
return res;
}


int main()
{
std::ios::sync_with_stdio(false); std::cin.tie(0);
int n;
cin >> n;
while(n--){
int a,p,k;
cin >> a >> k >> p;
cout << qmi(a,k,p) << '\n';
}
return 0;
}