AcWing
3625. 幂次方
快速幂。将$a^k$拆分为$a^{2^0+2^1+\cdots}$的形式,相当于将$k$以二进制的形式表示。这样一来,$a^k~mod~p$可以看作:
\[(((a^{2^0}~mod~p)~\cdot~(a^{2^1}~mod~p))~mod~p~\cdot~\cdots~\cdot~(a^{2^N}~mod~p))~mod~p\]注意用long long
处理所有可能爆int
的地方。
#include <bits/stdc++.h>
using namespace std;
int a, k, p = 233333;
typedef long long LL;
int qmi(int a, int k, int p){
int res = 1 % p;
while(k){
if(k & 1) res = (LL)res * a % p;
k >>= 1;
a = (LL)a * a % p;
}
return res;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> a >> k;
cout << qmi(a, k, p) << '\n';
return 0;
}