上述代码中的错误在于对于非常大的数进行求幂运算时,可能会导致溢出。在这个例子中,p=10000000000非常大,而求幂运算可能会导致结果超过ll类型的范围。

解决这个问题的方法是使用扩展的欧几里得算法(Extended Euclidean Algorithm)来计算模逆元。具体步骤如下:

  1. 计算a对模p的乘法逆元x,即ax ≡ 1 (mod p)。可以使用扩展的欧几里得算法来计算x。

  2. 将b改为bx,即b = bx (mod p)。

  3. 将a改为a^b,即a = a^b (mod p)。

  4. 返回a作为结果。

以下是修改后的代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long

ll exgcd(ll a, ll b, ll& x, ll& y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    ll d = exgcd(b, a % b, x, y);
    ll tmp = x;
    x = y;
    y = tmp - a / b * y;
    return d;
}

ll ksm(ll a, ll b, ll p) {
    ll x, y;
    exgcd(a, p, x, y);
    ll ans = 1 % p;
    while (b) {
        if (b & 1) ans = ans * a % p;
        a = a * a % p;
        b >>= 1;
    }
    return ans;
}

int main() {
    ll a = 138854, b = 173965, p = 10000000000;
    ll x, y;
    exgcd(a, p, x, y);
    b = (b * x) % p;
    ll result = ksm(a, b, p);
    cout << result << endl;
    return 0;
}

这样修改后,可以正确计算出结果

#include bitsstdc++husing namespace std;#define ll long longll ksmll all bll p ll ans=1p; whileb ifb&1 ans=ansap; a=aap; b=1; return ans;上述代码中带入a=138854b=173965p=1000

原文地址: http://www.cveoy.top/t/topic/hQxx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录