快速幂的裸题,注意数据范围要开long long。That's it.
风格1.
#include<cstdio> #include<iostream> using namespace std; long long mod; long long quick_pow(long long b,long long a){ if(!a) return 1; if(a&1) return(quick_pow(b,a-1)%mod*b)%mod; long long t=quick_pow(b,a/2)%mod; return (t*t)%mod; } int main(){ long long b,p; cin>>b>>p>>mod; printf("%lld^%lld mod %lld=%lld",b,p,mod,quick_pow(b,p)); return 0; }
风格2.
#include<cstdio> #include<iostream> #include<cmath> using namespace std; long long mod; long long quick_pow(long long x,long long n){ if(n==0) return 1; else{ while((n&1)==0){ n>>=1; x=(x*x)%mod; } } long long result=x; n>>=1; while(n!=0){ x=(x*x)%mod; if((n&1)!=0){ result=(result*x)%mod; } n>>=1; } return result; } int main(){ long long b,p; cin>>b>>p>>mod; printf("%lld^%lld mod %lld=%lld",b,p,mod,quick_pow(b,p)); return 0; }