1. 程式人生 > >洛谷P1226 快速冪||取餘運算 題解

洛谷P1226 快速冪||取餘運算 題解

題目描述

輸入b,p,k的值,求b^p mod k的值。其中b,p,k*k為長整型數。

輸入輸出格式

輸入格式:

三個整數b,p,k.

輸出格式:

輸出“b^p mod k=s”

s為運算結果

輸入輸出樣例

輸入樣例#1:
2 10 9
輸出樣例#1:
2^10 mod 9=7

題解

經典的分治題,首先我們知道:ab%k=(a%k)(b%k)%k,這樣我們就可以把大冪分成小冪,然後合併在取餘,現在我們要把次數分成小的逐步處理:p = 2p/2+p%2,設p = 15,b^15 = b ^(27+1) = b+b^7+b^7,遞迴拆分為小問題,逐步取餘;

#include <iostream>
using namespace std;
long long b, p, k,temp;
int FastPower(long long p) {
    if (p == 0) return 1;                  //b^0%k = 1
    long long t = FastPower(p / 2) % k;   //拆分求解
    t = (t*t) % k;
    if (p % 2 == 1) {        //如果p為奇數,則b^p%k = ((b^(p/2))^2)*b%k
        t = (t*b) % k;
    }
    
return t; } int main() { cin >> b >> p >> k; if (b == k) { cout << b << '^' << p << " mod " << k << '=' << 0; return 0; } temp = b; b %= k; //防止過大 cout << temp << '^' << p << "
mod " << k << '=' << FastPower(p); system("pause"); return 0; }