1.快速冪就是快速算底數的n次冪。其時間複雜度為 O(log₂N), 與樸素的O(N)相比效率有了極大的提高。
用法:用於求解 a 的 b 次方,而b是一個非常大的數,用O(n)的複雜度會逾時。那麼就需要這個演算法,注意它不但可以對數求次冪,而且可用於矩陣快速冪。 --百度百科
2.所謂的快速冪,實際上是快速冪模數的縮寫,簡單的說,就是快速的求一個冪式的模(餘)。在程式設計過程中,經常要去求一些大數對於某個數的餘數,為了得到更快、計算範圍更大的演算法,產生了快速冪模數演算法 --
平常我們求一個數 的n次冪,都是調用庫函數math.h裡面的
double pow(double x,double y)函數。
但是既然此方法的傳回值為double,就肯定存在精度誤差的問題。
而且資料一大容易逾時。
快速冪的目的就是做到快速求冪。
假設需要求a的11次冪。
普通解法:a*a*a*a*a*a*a*a*a*a*a 11步
快速冪: a^(2^0+2^1+2^3) 即2^1*a^2*a^8 3 步
由於是二進位,很自然地想到用位元運算這個強大的工具:
&和>>
&運算通常用於二進位取位操作,例如一個數 & 1 的結果就是取二進位的最末位。還可以判斷奇偶x&1==0為偶,x&1==1為奇。
>>運算比較單純,二進位去掉最後一位
int poww(int a,int b){ int ans=1,base=a; while(b!=0){ if(b&1!=0) ans*=base; base*=base; b>>=1; } return ans;}
假設需要求2的11次冪,ans和base的值如下表所示。
題目描述:
演算法提高 快速冪
時間限制:1.0s 記憶體限制:256.0MB
問題描述
給定A, B, P,求(A^B) mod P。
輸入格式
輸入共一行。
第一行有三個數,N, M, P。
輸出格式
輸出共一行,表示所求。
範例輸入
2 5 3
範例輸出
2
資料規模和約定
共10組資料
對100%的資料,A, B為long long範圍內的非負整數,P為int內的非負整數。
#include <stdio.h>#define ll long longint main(){ ll b,k; int p; scanf("%I64d%d%I64d",&b,&p,&k); ll t=1; while (p) { if (p & 1) t=(t*b)%k; b=(b*b)%k; p>>=1; } printf("%I64d\n",t); return 0;}