仅使用其他两个数字到达目标号码

时间:2015-01-07 05:54:11

标签: c++ algorithm math data-structures

我有两个数字L和R,L表示左,R表示右。 我必须使用L和R达到一定数量(F) 每次我必须从零开始。

示例: L:1 R:2 F:3

到达F所需的最小步数为3。 Ans:First R,Second R,Third L。

通过这种方式,我需要找到最少的方法。

My approach:

Quo = F/R;
Remain : F%R;

x*R-Y*L = Remain
==> (x*R - Remain)/L = Y
this equation is break when (x*R - Remain)%L = 0, so we find x and y from the equation above.
So final Steps would be Quo + x(No. of right steps) + y( no. of left steps).

For Above Example :
Quo = 3/2 = 1;
Remain = 3%2 =1;

Y = (x*2 -1)/1
(x*2 -1)%1 is zero for x=1;
Now increase x from zero,

So x is 1, y is 1

Final Ans = Quo (1) + x (1) + y(1) = 3.

我的代码:

#include <iostream>
using namespace  std;

int main()
{
        int F,R,L;
        cin >> F;
        cin >> R;
        cin >> L;

        int remain = F%R;
        int quo = F/R;

        int Right = 0;
        int left = 0;
        int mode = 1;
        while( mode !=0)
        {
            Right++;
         mode = (R*Right - remain)%L;
         left = (R*Right - remain)/L;

        }
        int final = quo + Right + left;
        cout << final;
}

但是我认为这不是一个好方法,因为我把x放在循环中可能相当昂贵

你能否建议我一个好方法来解决这个问题?

1 个答案:

答案 0 :(得分:2)

在下面给出的等式中

 x*R - Remain = 0modL
 where R, L and Remain are fixed.

可以写成

((x*R)mod L - Remain mod L) mod L = 0

如果Remain mod L = 0,则x * R应为L的倍数,使x为0modL。 均值x可以是0,nR,其中n是整数。

因此,简单地说,您可以在0和L-1之间尝试x来查找x。

因此,你的循环可以从0运行到L-1,这将使你的循环保持有限。

请注意,此mod与%不同。 -1 mod L = L-1-1%L = -1

还有另一种方法。

x*R mod L - Remain mod L = 0 mod L

导致

x*R mod L = Remain mod L
(x* (R mod L)) mod L = (Remain mod L)

您可以在L的字段(如果它存在)和计算Rinv中计算R的倒数(比如说x = (Remain*Rinv)modL)。 如果不存在逆,则意味着不能满足等式。

注意:我不是数学专家。如果出现任何问题,请提出您的意见。

请参阅:https://www.cs.cmu.edu/~adamchik/21-127/lectures/congruences_print.pdf