#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
上述代码中的错误在于对于非常大的数进行求幂运算时,可能会导致溢出。在这个例子中,p=10000000000非常大,而求幂运算可能会导致结果超过ll类型的范围。
解决这个问题的方法是使用扩展的欧几里得算法(Extended Euclidean Algorithm)来计算模逆元。具体步骤如下:
-
计算a对模p的乘法逆元x,即ax ≡ 1 (mod p)。可以使用扩展的欧几里得算法来计算x。
-
将b改为bx,即b = bx (mod p)。
-
将a改为a^b,即a = a^b (mod p)。
-
返回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;
}
这样修改后,可以正确计算出结果
原文地址: http://www.cveoy.top/t/topic/hQxx 著作权归作者所有。请勿转载和采集!