相信童鞋們做題多了會發現,很多題都是要求次冪的。如果資料比較小,用int 或者long long 的暴力也是可以出結果的,但很多題就不盡如人意了,資料往往非常大,long long 可能都存不下,甚至還會爆記憶體,導致資料出錯。
這時候就需要更快更省記憶體的演算法——快速冪
快速冪快速冪,就是快!想象一下,求2^16,是2*2*2*...乘16個2快,還是((2*2*2*2) * (2*2*2*2)) * ((2*2*2*2) * (2*2*2*2)) 再算 (2*2*2*2) * (2*2*2*2). . .比較快。所以,快速冪的原理來了:求a^n,只要求a^(n/2) * a^(n/2)即可,以此類推,倒著算,當然,這是n為偶數的情況。n為奇數時只要ans*a即可
int sq(ll a,ll n)
這裡判斷次數是否為奇數,有多種方法(暫時我只知道兩種):
① n%2(==1) ② n&1(==1) 因為&是與符號,在計算機中儲存都為二進位制數,只有n的尾數為1(即n為奇數)時,1&1=1,if條件才成立
有時次冪結果太大的,題上會要求取餘,那麼取餘應該怎麼做呢?
離散數學講到:積的取餘等於取餘的積的取餘。
舉個例子:(a * b)%mod = (a%mod * b%mod)%mod
在次冪也同樣適用,比如:2^3%mod = ((2%mod * 2%mod)%mod * 2%mod )%mod
看起來很複雜,但是寫成演算法就還好,注意不要少了取餘的個數,少取一次就誤差一點,少取n多次。。嗯。。。
int sq(ll a,ll n)
還有一種稍微優化一點的演算法,省去了pow函式
ll sq(ll a,ll n)
上面的方法是遞迴,還有一種迭代的寫法
ll quick_pow(ll a, ll n)
n/=2;
a=a*a%mod;
}return ans;
}
模板 快速冪 取餘運算
輸入b,p,k的值,求b p mod k的值。其中b,p,k k為長整型數。輸入輸出格式 輸入格式 三個整數b,p,k.輸出格式 輸出 b p mod k s s為運算結果 輸入輸出樣例 輸入樣例 1 2 10 9 輸出樣例 1 2 10 mod 9 7 硬來當然不是好方法。但是有乙個規律不知道各位...
快速冪 取餘運算(模板)
有那麼一種演算法可以讓計算a b變得更快,那就是快速冪。如果直接暴力計算的話需要計算b次。時間蠻長的。輸入a,b.a,b為整數 計算a b。輸入格式 兩個整數a b。輸出格式 輸出 a b s s為運算結果 前提 你需要了解二進位制,十進位制。位運算的知識 當然也可以沒有,萬事皆可模擬。沒有位運算的...
快速冪(求a的b次方 求餘運算)
求a的b次方 public static intquickpower int a,int b base base base自乘,由a 2 n 變成a 2 n 1 b 1 位運算,b右移一位,如1010變成101 把最右邊的1移掉了 除以2 1 return ans 取餘運算 取餘運算有一些好用的性質...