关于快速幂这个算法,已经不想多说,很早也就会了这个算法,但是原来一直靠着模板云里雾里的,最近重新学习,发现忽视了一个重要的问题,就是若取模的数大于int型,即若为__int64的时候应该怎么办,这样就得用到乘法快速幂+乘方快速幂了。
快速幂一般是为了解决乘方取模问题的,显然思想就是二分,下面贴上快速幂模板:
1 __int64 mulpow(__int64 a,__int64 p,__int64 m) 2 { 3 __int64 ans = 1; 4 while(p) 5 { 6 if(p&1) 7 ans = ans * a % m; 8 p >>= 1; 9 a = a * a % m; 10 } 11 return ans; 12 }
但是以上代码有个问题,并不适合m超过int的情况,下面提供m超过int情况的解法
1 __int64 multi(__int64 a,__int64 b,__int64 n) //乘法快速幂 2 { 3 __int64 temp=0; 4 while(b) 5 { 6 if(b&1) 7 { 8 temp+=a; 9 if(temp>=n) temp-=n; 10 } 11 a<<=1; 12 if(a>=n) a-=n; 13 b>>=1; 14 } 15 return temp; 16 } 17 18 __int64 mulpow(__int64 a,__int64 m,__int64 n) //乘方快速幂 19 { 20 __int64 temp=1; 21 a%=n; 22 while(m) 23 { 24 if(m&1) temp=multi(temp,a,n); 25 a=multi(a,a,n); 26 m>>=1; 27 } 28 return temp; 29 }
但缺点就是速度慢了点,logn*logn的
时间: 2024-10-12 12:55:49