#include <stdio.h>
#include <stdlib.h>
int pw(int x, int y, int p) {
if (!y) {
return 1;
}
int res = pw(x*x%p,y/2,p);
if (y & 1) {
res = res * x % p;
}
return res;
}
int main() {
int x, y, p;
scanf("%d%d%d",&x,&y,&p);
printf("%d",pw(x,y,p));
return 0;
}
引理:积的取余等于取余的积的取余
long long Mode(long long a, long long b, long long mode)
{
long long sum = 1;
a = a % mode;
while (b > 0) {
if (b % 2 == 1) //判断是否是奇数,是奇数的话将多出来的数事先乘如sum
sum = (sum * a) % mode;
b /= 2;
a = (a * a) % mode;// 不断的两两合并再取模,减小a和b的规模
}
return sum;
}
b&1型写法
&与运算,如果同为1才得1,否则为零`
long long Mode(long long a, long long b, long long mode)
{
long long sum = 1;
while (b) {
if (b & 1) {//看b最后一位是否是1,即b是否是基数
sum = (sum * a) % mode;
b--;
}
b /= 2;
a = a * a % mode;
}
return sum;
}