快速冪取模

2021-06-08 08:43:00 字數 1192 閱讀 1617

今天acm培訓知識:快速冪取模問題

有時我們會碰到求a^b%c的問題,當資料較大時我們有一種比較好的方法(汗,忘了叫什麼方法了)

思路:我們先看命題1:(a*b)%c=(a%c*b%c)%c 括號裡面可以有n項乘法。

;首先很容易理解這個,進而有個拓展命題 2:若a>c,則a^b%c=((a%c)^b)%c;

這時我們考慮到二進位制,因為a^2%c,可以化為a%c的一些運算,把b化為二進位制。

例如:3^11%4.考慮11為1011b(二進位制),故而3^11%4=((3^1000b%4) *( 3^10b%4)*(3^1b%4))%3。對於二進位制位為1的進行計算.

整體思路就是不斷模2除2(化二進位制),同時底數不斷平方(10011,權值依次為右邊一位的平方),同時底數若大於c可以取模(命題2)

這時我們大概可以寫出演算法.

int powermod(int a,int b,int c)

return ans;

}

附:hdu1061

#include#includeint fun(int a,int b,int c)

a=a*a%c;

b=b>>1;

} return ans;

}int main()

return 0;

}

當然除了整數的快速冪取模,還有矩陣的翻版.類似的換為矩陣的乘法和取模,(矩陣的取模指的是每個元素取模)

附:hdu1575 

#include#include#define c 9973

#define max 11

int n,k,ans[max][max],a[max][max];

void matrixmulmod(int x[max][max],int y[max][max])

; int i,j,k;

for(i=0;i>1; }}

int main()

{ int i,j,ncase,sum;

scanf("%d",&ncase);

while(ncase--)

{ scanf("%d%d",&n,&k);

for(i=0;i

好了,今天的一半學習內容到此,快速冪取模。還是很弱的我,一天做了4,5題,好多思路都在他人的指導下糾結寫完,還得繼續努力啊.

快速冪 快速冪取模

快速冪的思想在於快速求解高冪指數的冪運算 複雜度為o log2n 與樸素運算相比有很大的改進 接下來給出 其中有詳解 include include using namespace std typedef long long ll ll pow1 int a,int b 最常規的方法 將冪指數轉化為...

快速冪 快速冪取模

求x m 一般方法是 xm x xm 1,這樣需要做m次乘法,未免過慢。加速方法有兩種。1.基於當m為偶數時,xm x2 m 2 當m為奇數時,xm x xm 1。顯然當m為偶數時m會減半,當m為奇數時,下次就是偶數。m可以很快收斂到0.表示冪 2.將m看成二進位制串mkmk 1 m1m0,那麼xm...

快速冪 快速冪取模

原文 快速冪這個東西比較好理解,但實現起來到不老好辦,記了幾次老是忘,今天把它系統的總結一下防止忘記。首先,快速冪的目的就是做到快速求冪,假設我們要求a b,按照樸素演算法就是把a連乘b次,這樣一來時間複雜度是o b 也即是o n 級別,快速冪能做到o logn 快了好多好多。它的原理如下 假設我們...