快速冪||取餘運算
阿新 • • 發佈:2020-08-10
題目描述
給你三個整數 b,p,k,求 \(b^p\) mod k。
輸入格式
輸入只有一行三個整數,分別代表 b,p,k。
輸出格式
輸出一行一個字串 b^p mod k=s
,其中b,p,k分別為題目給定的值,s為運算結果。
資料規模與約定
對於100%的資料,保證0 \(\leq\) b,p \(\leq\) \(2^{31}\),1 \(\leq\) k \(\leq\) \(2^{31}\) 。
思路
快速冪的模板題,沒有什麼好說的。有兩個細節需要注意:
1)a%2==1與a&1==1是等價的。
2)取模的運算不會干涉乘法運算。
3)根據費馬小定理,如果k是一個質數,我們可以計算\(b^{p mod(k-1)}\)
程式碼如下:
#include<iostream> #include<vector> #include<algorithm> using namespace std; typedef long long int ll; long long binpow(long long a, long long b, long long m) { a %= m; long long res = 1; while (b > 0) { if (b & 1) res = res * a % m; a = a * a % m; b >>= 1; } return res; } int main() { ios::sync_with_stdio(false); cin.tie(0); ll b,p,k; cin>>b>>p>>k; cout<<b<<"^"<<p<<" mod "<<k<<"="<<binpow(b%k,p,k)%k<<endl; return 0; }