快速冪詳解 codevs 1497

2021-08-10 18:14:16 字數 916 閱讀 5403

*紀念下ac的第一道快速冪型別題……大佬勿噴,歡迎指出錯誤。*

這道題題目大概是說,給你 b,p,k三個數,請你求出b^p mod k的值。

身為一名資深蒟蒻,習慣性的想到了樸素做法:

for(int i=1;i

<=p;i++)

ans=((ans

%k)*(ans%k))%k;

cout << ans

<< endl;

但是,仔細一想,發現這道題完全可以使用快速冪來解決。

快速冪大概就是將a^b中的b轉換為二進位制,然後用o(log2n)的複雜度算出ans,具體請見下面的例子:

以題目樣例 2^10 mod 9來舉例子

10也就是二進位制中的1010,於是2^10可以轉化為:

2^(2^1)*2^(2^3)

那麼同理,a^10可以轉化為:

a^(2^1)*a^(2^3)

於是,a^b就可以轉化為:b在二進位制中若第i位為1,那麼a*=a^(2^(i+1)),由於要考慮mod k,所以**如下:

int getpaw(int a,int b)

return ans%k;

}

最後附上這道題題解:

#include 

#include

#include

using

namespace

std;

long

long b,p,k;

int paww(int a,int b)

return ans%k;

}int main()

codevs 1497 取餘運算

題目描述 輸入b,p,k的值,程式設計計算bp mod k的值。其中的b,p,k k為長整型數 2 31範圍內 輸入描述 b p k 輸出描述 輸出b p mod k 左右沒有空格 樣例輸入 2 10 9 樣例輸出 2 10 mod 9 7 分析這道題要採用模冪運算。首先引入乙個運算規則 a b p...

codevs 1497取餘運算

時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamon 輸入b,p,k的值,程式設計計算bp mod k的值。其中的b,p,k k為長整型數 2 31範圍內 輸入描述 input description b p k 輸出描述 output description 輸出b p m...

codevs 1497 取餘運算

時間限制 1 s 空間限制 128000 kb 題目等級 鑽石 diamond 題目描述 description 輸入b,p,k的值,程式設計計算bp mod k的值。其中的b,p,k k為長整型數 2 31範圍內 輸入描述 input description b p k 輸出描述 output d...