NYOJ 102 次方求模

2021-09-26 03:24:28 字數 1607 閱讀 8359

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...