快速幂以及一个bug(#10196. 「一本通 6.1 练习 3」越狱)

本文介绍了一种使用快速幂算法进行高效幂次运算的方法,并通过一个具体的C++代码示例展示了如何实现快速幂运算,包括如何避免溢出和处理负数结果等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

  • +mod,防止相减
+  `fastPow(m % mod, n) - (m % mod) * fastPow((m - 1) % mod, (n - 1)) % mod + mod) % mod出现负数
  • 对于数据及时取模,防止溢出
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <vector>

using namespace std;
typedef long long ll;

//const int INF = 0x3f3f3f3f;
//const int MAXN = ;
const ll mod = 100003;
// int n, m;
ll fastPow(ll a, ll b) {
    a %= mod;
    ll ret = 1;
    while (b) {
        if (b % 2 == 1) ret = (ret * a % mod) % mod;
        a = ((a % mod) * (a % mod)) % mod;
        b /= 2;
    }
    return ret;
}
int main() {
#ifdef LOCAL
    freopen("zz_in.txt", "r", stdin);
    freopen("zz_op.txt", "w", stdout);
#endif
    ll n, m;
    cin >> m >> n;
    cout << (fastPow(m % mod, n) - (m % mod) * fastPow((m - 1) % mod, (n - 1)) % mod + mod) % mod;
    //+ mod,防止相减出现负数
#ifdef LOCAL
    printf("Time used = %.2f\n", (double) clock() / CLOCKS_PER_SEC);
#endif
    return 0;
}

快速幂的另一种写法

int fastPow(long long a, int b, int m) {
    if (b == 1) return a;
    if (b % 2 == 0) {
        long long t = fastPow(a, b / 2, m); 
        //易出错,漏掉fastPow而只写了括号
        return t * t % m;
    } else {
        long long t = fastPow(a, b / 2, m);
        t = t * t % m;
        t = t * a % m;
        return t;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值