對於任何乙個整數的模冪運算
a^b%c
對於b我們可以拆成二進位制的形式
b=b0+b1*2+b2*2^2+…+bn*2^n
這裡我們的b0對應的是b二進位制的第一位
那麼我們的a^b運算就可以拆解成
a^b0*a^b1*2*…*a^(bn*2^n)
對於b來說,二進位制位不是0就是1,那麼對於bx為0的項我們的計算結果是1就不用考慮了,我們真正想要的其實是b的非0二進位制位
那麼假設除去了b的0的二進位制位之後我們得到的式子是
a^(bx*2^x)*…*a(bn*2^n)
這裡我們再應用我們一開始提到的公式,那麼我們的a^b%c運算就可以轉化為
(a^(bx*2^x)%c)…(a^(bn*2^n)%c)
這樣的話,我們就很接近快速冪的本質了
(a^(bx*2^x)%c)…(a^(bn*2^n)%c)
我們會發現令
a1=(a^(bx*2^x)%c)
… an=(a^(bn*2^n)%c)
這樣的話,an始終是a(n-1)的平方倍(當然加進去了取模勻速那),依次遞推
ll mod_pow(ll x, ll n, ll mod)
return res;
}
模板 快速冪
1.萌新的話 快速冪主要是用來解決一些超時間複雜度的冪運算。其主要思想是根據乙個結論 2 n 4 n 2 這樣原本暴力的o n 演算法優化為了o logn 的演算法了。時間複雜度 2.include include include include include using namespace st...
快速冪(模板)
快速冪原理就是將emm 比如求n的m次方nm那麼就將m轉化為2進製數 對每一位進行判斷,如果當前位數為1就進行一次乘法,同時每次判斷後的乘數為n的當前判斷的m的位數的冪。假設當前已經判斷到2進製下m的第k位位數上為一那麼乘上nk。好懂 include define ll long long usin...
快速冪模板
快速冪模板 下面是自己寫的,比較清楚 include include include includeusing namespace std typedef long long ll const ll mod 1e9 7 ll binarypow1 ll a,ll b ll binarypow2 ll...