只有一个地方不懂,首先我知道取余公式(ab)%p=(a%pb%p)%p,那么ans那一层我是可以理解的的,但是base为什么也要对p取余呢??这样每次ans乘上的东西不就不是a^(2^n)了吗?很疑惑,希望有人能读懂我的意思,必采纳
#include <iostream>
#define LL long long
using namespace std;
LL a,b,p;
LL ksm(LL a,LL b)
{
LL ans = 1,base = a;
while (b)
{
if (b&1)
{
ans*=base;
ans%=p;
}
base*=base;
//base%=p;
b>>=1;
}
return ans%p;
}
int main()
{
cin>>a>>b>>p;
cout<<a<<"^"<<b<<" mod "<<p<<"="<<ksm(a,b) <<endl;
return 0;
}
你可以想想,如果base是10的18次方时,如果不对 base*base 取余,10的18次方乘10的18次方是10的36次方,是不是就爆long long呢