# Modular Exponentiation# Binary Exponentiation# Number Theory

d636 - 大爆炸bomb

🔗 前往 ZeroJudge 原題

題目描述

題目要求計算 a 的 b 次方,並將結果模 10007 輸出。由於 a 和 b 的值可能很大,直接計算 a^b 會導致溢出,因此需要使用模運算來避免溢出。

解題思路

本題的核心是快速冪(Binary Exponentiation)演算法。快速冪是一種高效計算整數冪的方法,它利用了以下原理:

  • 如果 b 是偶數,則 a^b = (a^(b/2))^2
  • 如果 b 是奇數,則 a^b = a * (a^(b/2))^2

通過遞迴地應用這個原理,我們可以將計算 a^b 的次數減少到 log(b) 級別,從而避免了溢出和提高計算效率。

程式碼中 mod 函數實現了快速冪演算法,並在每次乘法運算後取模,以防止溢出。

複雜度分析

  • 時間複雜度: O(log b)
  • 空間複雜度: O(log b) (由於遞迴調用堆疊)

程式碼

#include <iostream>
using namespace std;
long long int bm;
inline long long int mod(long long int b,long long int p){
	if(p==0)return 1;
	if(p==1)return bm;
	bool o=p&1;
	p>>=1;
	long long int tmp=mod(b,p);
	if(o)
		return tmp*tmp*b%10007;
	else
		return tmp*tmp%10007;
}
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	long long int b,p;
	while(cin >> b >> p){
		bm=b%10007;
		cout << mod(b,p) << "\n";
	}
}

Discussion