//(a^b)%n
#include<iostream>
//這里用的是什么方法呢?
int modExp(int a,int b,int n)


{
int t=1,y=a;
while(b)

{
if(b%2==1)t=t*y%n;
y=y*y%n;
b=b/2;
}
return t;
}
//常規(guī)
int modexp(int a,int b,int n)


{
int t=1;
for(int i=0;i<b;i++)t=t*a;
return t%n;
}

int main(void)


{
int a=0,b=0,n=0;
std::cin>>a>>b>>n;
std::cout<<modExp(a,b,n)<<std::endl;
std::cout<<modexp(a,b,n)<<std::endl;
return 0;
}

誰能給我講講它這個(gè)方法是什么數(shù)學(xué)原理呢?
//第二個(gè)函數(shù)僅為測試正確性設(shè)置,不考慮溢出問題
//這里用的是什么方法呢?
int modExp(int a,int b,int n)
{
//
// 例子 a^9 = a * ((a^4)^2).
// 8 <- 4 <- 2 <- 1
// 9 = 8 + 1
//
int t=1,y=a;
while(b)
{
if(b%2==1)t=t*y%n;
y=y*y%n;
b=b/2;
}
return t;
}
//常規(guī)
int modexp(int a,int b,int n)
{
int t=1;
for(int i=0;i<b;i++)t=t*a; // 這里會(huì)有溢出的可能吧?
return t%n;
}
如求a^15:
15=2^3+2^2+2^1+2^0
a^8=(a^4)^2 a^4=(a^2)^2 ...
預(yù)先求出a^8,a^4,a^2,a^1,相乘即得a^15。