今天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 快了好多好多。它的原理如下 假設我們...