洛谷 P1226 【模板】快速幂||取余运算
一个数a的n次方可能会很大,在计算过程中,虽然可以运用取模运算将a的某次幂保留在模p的范围内,但下一次的运算就有可能爆(a<=10^9;b<=10^9;c=a*b<=10^18);
故在运算过程中,可以将a的指数k不断二分,这样,可以使它的幂分成两个较小幂的形式,在转化为long long 类型数据,可以有效防止运算结果过大。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> usingnamespacestd; int ksm(int b,int p,int k) { int sum; if(b==0&&p!=0) return0; if(b==0&&p==0) return0; if(b!=0&&p==0) return1; sum=ksm(b,p>>1,k); sum=1ll*sum*sum%k; if(p%2==1) sum=1ll*sum*b%k; return sum; } int main(void) { longlong b,p,k,s; cin>>b>>p>>k; cout<<b<<"^"<<p<<" mod "<<k<<"="<<ksm(b,p,k)%k; return0; }