【问题标题】:Finding all the ordered pairs of integers lying on a line ax+by=c in better than O(n^2) time complexity [duplicate]以优于 O(n^2) 的时间复杂度找到位于 ax+by=c 线上的所有有序整数对[重复]
【发布时间】:2017-12-01 07:44:29
【问题描述】:

我正在尝试编写一个可以输入 3 个 long int 变量 a、b、c 的代码。 代码应该找到所有整数 (x,y) 以便 ax+by = c,但输入值最大为 2*10^9。我不确定如何有效地做到这一点。我的算法是 O(n^2),这对于如此大的输入来说真的很糟糕。我怎样才能做得更好?这是我的代码-

typedef long int lint;

struct point
{
lint x, y;
};

int main()
{
lint a, b, c;
vector <point> points;
cin >> c >> a >> b;
for(lint x = 0; x < c; x++)
    for(lint y = 0; y < c; y++)
    {
        point candidate;
        if(a*x + b*y == c)
        {
            candidate.x = x;
            candidate.y = y;
            points.push_back(candidate);
            break;
        }
    }
}

【问题讨论】:

  • xy 不能为负数吗?
  • 你应该检查Extended Euclidean Algorithm,这是最快的算法(据我所知)解决这个丢番图方程。
  • 您的代码假定c 是正数,并且仅检查xy 的非负值。在相同的约束下,消除内部循环并检测是否有任何值将是微不足道的。然后一个更简单的循环,如果有一个值,找到其他值。没有这些限制,潜在对的数量是无限的。
  • 我应该在帖子中提到,a、b、c 必须是正值。

标签: c++ linear-equation


【解决方案1】:

对于任何给定的x 值,您似乎可以应用一点非常微不足道的数学来求解y。从ax + by = c开始:

ax + by = c

by = c - ax

假设非零b1,我们得到:

y = (c - ax) / b

有了这个,我们可以在循环中生成x 的值,将其代入上面的等式,然后计算y 的匹配值并检查它是否为整数。如果是这样,添加 (x, y) 对,然后继续 x 的下一个值。

当然,您可以进行下一步并找出 x 的哪些值会导致所需的 y 成为整数,但是即使不这样做,我们也已经移动了从 O(N2) 到 O(N),这可能足以在更合理的时间范围内完成任务。


  1. 当然,如果b 为0,那么by 项为0,所以我们有ax = c,然后我们可以把它变成x = c/a,所以我们只需要检查x是一个整数,如果是这样,那么所有具有 y 候选值的 x 对都将产生正确的 c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-12
    • 2022-03-04
    • 2019-07-06
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2016-06-21
    相关资源
    最近更新 更多