想弄清本題演算法,需要先了解取模(求餘)運算的一些性質,比如:
遞迴的思想就是利用二分法。它基於如下事實:
(1)如果p是奇數,那麼有bp=b*bp-1
(2)如果p是偶數,那麼有bp=bp/2*bp/2
且臨界值b0=1.
注意:不能直接寫成return binarypow(b,p/2,k)*binarypow(b,p/2,k)%k;
,這樣的話時間複雜度為o(2logp)=o( p )。
#include
typedef
long
long ll;
using
namespace std;
ll binarypow
(ll b,ll p,ll k)
intmain()
如果把p寫成二進位制,那麼b就可以寫成若干二次冪之和,例如13的二進位制是1101,於是13=23+22+20=8+4+1,所以b13=a8*a4*a1.
類似的,對於任意ab,它可以表示為a2k,…,a4,a2,a1中若干項的成績。其中,若b的二進位制i號位為1,則a2i就被選中。
#include
typedef
long
long ll;
using
namespace std;
intmain()
b=b*b%k;
p>>=1;
}printf
("%lld"
,ans%k)
;return0;
}
二分法快速排序
我在實現二分法快速排序的時候,最初的程式是這樣的。include using namespace std void qsort int arr,int left,int right while l r arr l value l if arr l value while l r arr l valu...
C 二分法查詢,遞迴二分法
用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...
python二分法查詢 Python 二分法查詢
二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...