指数 b 可达 10^9,用二进制拆分把 a^b 化成若干 a^(2^k) 之积再相乘,Python 三参数 pow 一步完成 O(log b) 模幂。
OJ: roj
题目 ID: 1616
难度:入门
标签:数学快速幂python
创建: 2026-09-30 22:18
更新: 2026-10-06 01:04
后置题目
roj 3523[NOIP2003-普及] 麦森数B 的末 500 位子问题直接复用 A 教的三参数 pow 模快速幂,只是把底数换成 2、模换成 10**500roj 300164位整数乘法B 整体套用 A 教的『二进制拆分+相邻项只差一次递推+只在位为 1 时累乘』骨架,把底数平方换成加数自加、累乘换成累加,据此在 64 位溢出场景下仍保持 O(log b),B 另叠加中间量不超过 2p 的取模论证。roj 1643「一本通 6.5 例 3」Fibonacci 前 n 项和B 的 mat_pow 逐行照搬 A 教的二进制快速幂骨架(重复平方、位1乘入、边乘边取模),只是把标量换成2×2矩阵求 T^(n+1)roj 1618「一本通 6.1 练习 3」越狱B 在正难则反得到 m^n − m(m−1)^(n−1) 后,直接复用 A 教的三参数 pow 模快速幂算这两个幂,B 的额外台阶是取补集与逐位乘法原理计数。roj 10006涨薪B 的 main.cpp 中 ll power(ll base,ll exp)(result=result*base%MOD、base=base*base%MOD、exp>>=1)与 power(3,m)、power(2,m) 正是复用 A 教的「底数逐位平方、每一步取模」这一模快速幂步骤,用来把 m 年倍数 3^m、2^m 算成模值后代入 3^m S_x+2^m(S_{x+y}-S_x);B 的 m 可达 1e9 使该步与 A 同样必要(main.py 用 pow(3,m,MOD)),另在其外叠加降序排序、前 k 大求和与剔除 k=n-x-y 人的贪心结论。
题目描述
给定正整数
输入一行三个整数
样例输入:2 100 1007,样例输出:169。
思路
把指数
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-30 22:18
# update_at: 2026-09-30 22:18
import sys
def solve() -> None:
a, b, m = map(int, sys.stdin.buffer.read().split())
# a^b 完整展开有 b*log10(a) 位(b 可达 1e9),先算幂再取模会撑爆内存,
# 必须边平方边取模;三参数 pow 底层正是二进制快速幂,指数每折半一次。
print(pow(a, b, m))
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-06 01:04
* update_at: 2026-10-06 01:04
*/
#include <iostream>
using namespace std;
typedef long long ll;
ll a, b, m;
// 二进制快速幂:把指数 b 拆成二进制,边平方边取模
ll qpow(ll base, ll exp, ll mod) {
ll ans = 1 % mod;
base %= mod;
while (exp > 0) {
if (exp & 1) ans = ans * base % mod; // 当前二进制位为 1,乘入答案
base = base * base % mod; // 底数平方,准备下一位
exp >>= 1;
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> a >> b >> m;
cout << qpow(a, b, m) << '\n';
return 0;
}