1. 程式人生 > 實用技巧 >快速冪||取餘運算

快速冪||取餘運算

題目描述

給你三個整數 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;
}

參考資料

1)https://oi-wiki.org/math/quick-pow/