C++有关快速幂的困惑点

只有一个地方不懂,首先我知道取余公式(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呢