1//
a^b mod c=(a mod c)^b mod c很容易設計出乙個基於二分的遞迴演算法。
2 #include3 #include4
//快速冪演算法,數論二分
5long
long powermod(int a,int b, int c) //
不用longlong就報錯,題目中那個取值範圍不就在2的31次方內615
intmain()
1625 system("
pause");
26return0;
27}28
剛開始用pow函式求次冪,後來發現結果以及引數都為浮點型,我就強行轉化為(int)得出的結果不對,看來這種方法不行
一旦遇到高次方連乘,一定要記得快速冪啊,太有用了!!!
2:快速冪取模
快速冪取模就是在o(logn)內求出a^n mod b的值。演算法的原理是ab mod c=(a mod c)(b mod c)mod c
因此很容易設計出乙個基於二分的遞迴演算法。
心得:這題wa好多次了,找了好久多沒發現錯誤,long long 2^63 大概是 9*10^18,假如999999999*999999999*999999999肯定超過int 64位的長度了,所以一定溢位。
快速冪取模就是在o(logn)內求出a^n mod b的值。演算法的原理是ab mod c=(a mod c)(b mod c)mod c
因此很容易設計出乙個基於二分的遞迴演算法。
以下是我的**,以下**必須保證輸入的是合法的表示式,比如不能出現0^0 mod b:
long exp_mod(long a,long n,long b)
3:高次方求模:
比如a的b次方對c求模
我們可以把b 化為二進位制形式看那一位有1
比如b=10101則 a^b=a^(10000)*a^(100)*a^(1)
以函式形式體現:
long long a,b,c;
void han()
printf("%lld\n",s%c);
}4:據說,矩陣快速冪在遞推式優化上相當神奇,而且效率很高。。。
兩矩陣相乘,樸素演算法的複雜度是o(n^3)。如果求一次矩陣的m次冪,按樸素的寫法就是o(n^3*m)。既然是求冪,不免想到快速冪取模的演算法,這裡有快速冪取模的介紹,a^b %m 的複雜度可以降到o(logb)。如果矩陣相乘是不是也可以實現o(n^3 * logm)的時間複雜度呢?答案是肯定的。
5:同餘冪的思想
求出同餘冪bn mod m,其中b,n,m都是比較大的整數。例如取b=12345678,n=456789,直接計算顯然是不可行的,可以把n按二進位制展開,則n=456789就變成了1101111100001010101,這樣每次只需要求b mod m,b2 mod m,... b2^(k-1) mod m,然後把對應位置上的二進位制是1的項乘起來,每次乘完後求除m的餘數即可,大大降低了計算的複雜度。
偽**如下:
這裡還要用一些同餘定理
(a+b)mod m=((a mod m)+(b mod m))mod m;
a*b mod m=(a mod m)*(b mod m) mod m;
a^b mod m=(a mod m)^b mod m;
NYOJ 102 次方求模
描述 求a的b次方對c取餘的值 輸入 第一行輸入乙個整數n表示測試資料的組數 n 100 每組測試只有一行,其中有三個正整數a,b,c 1 輸出輸出a的b次方對c取餘之後的結果 樣例輸入 3 2 3 5 3 100 10 11 12345 12345 樣例輸出 3 110481 include 高次...
NYOJ 102 次方求模
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 求a的b次方對c取餘的值 輸入 第一行輸入乙個整數n表示測試資料的組數 n 100 每組測試只有一行,其中有三個正整數a,b,c 1 輸出輸出a的b次方對c取餘之後的結果 樣例輸入 3 2 3 5 3 100 10 11 123...
NYOJ 102 次方求模
時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 求a的b次方對c取餘的值 輸入 第一行輸入乙個整數n表示測試資料的組數 n 100 每組測試只有一行,其中有三個正整數a,b,c 1 輸出輸出a的b次方對c取餘之後的結果 樣例輸入 3 2 3 5 3 100 10 11 123...