AcWing 204 表达整数的奇怪方式
发布日期:2021-05-28 16:27:06 浏览次数:31 分类:精选文章

本文共 1393 字,大约阅读时间需要 4 分钟。

为了解决这个问题,我们需要找到满足一系列同余条件的最小非负整数 x。如果不存在这样的 x,则返回 -1。

方法思路

这个问题可以通过逐步合并同余方程来解决,每一步都确保当前解满足所有处理过的方程。我们使用扩展欧几里得算法来找到满足贝祖定理的条件,从而确保每一步都能正确地得到一个解,直到所有方程都被处理。

具体步骤如下:

  • 读取输入,初始化变量。
  • 逐步处理每个同余方程组:
    • 计算当前方程组的最大公约数 (gcd)。
    • 检查是否有解,若无解则返回 -1。
    • 通过扩展欧几里得算法找到合适的系数,更新解 x 和模数 M。
  • 最后调整 x 到模最小的范围内,确保得到最小的非负解。
  • 解决代码

    #include 
    #include
    using namespace std;typedef long long ll;ll exgcd(ll a, ll b, ll &x, ll &y) { if (!b) { x = 1; y = 0; return a; } ll d = exgcd(b, a % b, y, x); y -= a / b * x; return d;}int main() { int n; cin >> n; if (n == 0) { cout << 0 << endl; return 0; } ll x = 0; ll a1; ll m1; cin >> a1 >> m1; for (int i = 0; i < n - 1; ++i) { ll a2, m2; cin >> a2 >> m2; ll d = exgcd(a1, -a2, k1, k2); if ((m2 - m1) % d != 0) { x = -1; break; } k1 = (k1 % (a2 / d) + a2 / d) % (a2 / d); x = k1 * a1 + m1; ll new_M = a1 / d * a2; a1 = new_M; m1 = x; x %= new_M; } if (x != -1) { x %= a1; if (x < 0) { x += a1; } } cout << x << endl; return 0;}

    代码解释

  • 扩展欧几里得算法:用于找到贝祖系数,并返回最大公约数。这在合并同余方程时非常有用。
  • 读取输入:首先读取输入数据,初始化变量。
  • 逐步处理方程:对于每个方程,计算当前方程与解的兼容性,更新解 x 和模数。若在任何一步发现无解,立即返回 -1。
  • 调整解 x:确保 x 是非负且最小的,适用于模运算的结果。
  • 输出结果:根据处理结果输出 x,如果无解则输出 -1。
  • 通过这种方法,我们可以高效地解决问题,并确保找到满足所有同余条件的最小解。

    上一篇:AcWing 883 高斯消元解线性方程组
    下一篇:AcWing 878 线性同余方程

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年05月05日 11时39分33秒