转自AcWing 875. 快速幂-数论-C++(递归、迭代、暴力)
快速幂代码 O(nlogb)(n组数据,每组logb,b表示几次幂)
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll qmi(ll a,int k,int p)
{
ll res=1;
while(k)//对k进行二进制化,从低位到高位
{
//如果k的二进制表示的第0位为1,则乘上当前的a
if(k&1) res=res*a%p;
//k右移一位
k>>=1;
//更新a,a依次为a^{2^0},a^{2^1},a^{2^2},....,a^{2^logk}
a=a*a%p;
}
return res;
}
int main()
{
int n;
scanf("%d",&n);
while (n -- )
{
ll a;
int k,p;
scanf("%ld%d%d",&a,&k,&p);
printf("%ld\n",qmi(a,k,p));
}
return 0;
}
以下转自:光速幂
代码:
#include <bits/stdc++.h>
#define LL long long
const int P = 1e9 + 7;
const int BL = (1 << 16) + 5, B = sqrt(P);
int qp[BL][2];
int ph;
int phi(int x)
{
int res = x;
for (int i = 2; i * i <= x; i++)
{
if (x % i == 0)
res = res / i * (i - 1);
while (x % i == 0)
x /= i;
}
if (x > 1)
res = res / x * (x - 1);
return res;
}
void init(int x)
{
ph = phi(P);
qp[0][0] = qp[0][1] = 1;
for (int i = 1; i <= B; ++i)
qp[i][0] = qp[i - 1][0] * x % P;
for (int i = 1; i <= B; ++i)
qp[i][1] = qp[i - 1][1] * qp[B][0] % P;
}
int qqpow(int y)
{
y %= ph;
return qp[y % B][0] * qp[y / B][1] % P;
}