反复平方法求乘积

4:反复平方法计算幂次式p^n

   这是本题关键所在,求n次幂方法的好坏,决定了本题是否TLE。

   以p=2,n=8为例

   常规是通过连乘法求幂,即2^8=2*2*2*2*2*2*2*2

   这样做的要做8次乘法

 

   而反复平方法则不同,

   定义幂sq=1,再检查n是否大于0,

While,循环过程若发现n为奇数,则把此时的p值乘到sq

{

   n=8>0 ,把p自乘一次, p=p*p=4     ,n取半 n=4

   n=4>0 ,再把p自乘一次, p=p*p=16   ,n取半 n=2

n=2>0 ,再把p自乘一次, p=p*p=256  ,n取半 n=1,sq=sq*p

n=1>0 ,再把p自乘一次, p=p*p=256^2  ,n取半 n=0,弹出循环

}

则sq=256就是所求,显然反复平方法只做了3次乘法

__int64 power(__int64 p,__int64 n)  //反复平方法求(p^n)%mod
69 {
70     __int64 sq=1;
71     while(n>0)
72     {
73         if(n%2)
74             sq=(sq*p)%mod;
75         n/=2;
76         p=p*p%mod;
77     }
78     return sq;
79 }
原文地址:https://www.cnblogs.com/lmjer/p/8857811.html