Я читал о линейных диофантовых уравнениях, таких как ax+by=c
, которые называются диофантовыми уравнениями и дают целочисленное решение, только если gcd(a,b) divides c
.
Эти уравнения имеют большое значение в соревнованиях по программированию. Я просто искал в Интернете, когда столкнулся с этой проблемой. Думаю, это разновидность диофантовых уравнений.
Проблема :
У меня есть два человека, Человек X и Человек Y, оба стоят в середине веревки. Человек X может за один ход перепрыгивать юниты A или B влево или вправо. Человек Y может за один ход перепрыгивать юниты C или D влево или вправо. Теперь мне дали число К, и я должен найти ответ «нет». возможных положений на веревке в диапазоне [-K, K], чтобы оба человека могли достичь этого положения, используя свои соответствующие фильмы, любое количество раз. (A, B, C, D и K даны под вопросом).
Мое решение:
Думаю, математически эту проблему можно решить с помощью диофантовых уравнений.
Я могу составить уравнение для человека X, например A x_1 + B y_1 = C_1 where C_1 belongs to [-K,K]
, и аналогичным образом для человека Y, например C x_2 + D y_2 = C_2 where C_2 belongs to [-K,K]
.
Теперь мое пространство поиска сводится к простому нахождению количества возможных значений, для которых C_1 и C_2 одинаковы. Это будет мой ответ на эту проблему.
Чтобы найти эти значения, я просто нахожу gcd(A,B)
и gcd(C,D)
, затем беру lcm этих двух gcd, чтобы получить LCM(gcd(A,B),gcd(C,D))
, а затем просто вычисляю количество точек в range [1, K], кратные этому lcm.
Мой окончательный ответ будет 2*no_of_multiples in [1,K] + 1
.
Я пробовал использовать ту же технику в своем коде на C ++, но он не работает (неправильный ответ).
Это мой код: http://pastebin.com/XURQzymA
У меня вопрос: может ли кто-нибудь сказать мне, правильно ли я использую диофантовы уравнения?
Если да, то может ли кто-нибудь рассказать мне о возможных случаях, когда моя логика не работает.
Это некоторые из тестовых примеров, которые были предоставлены на сайте с постановкой задачи.
A B C D K даны в качестве входных данных в той же последовательности, а соответствующие выходные данные приведены в следующей строке:
2 4 3 6 7
3
1 2 4 5 1
3
10 12 3 9 16
5
Это ссылка на исходную задачу. Я написал исходный вопрос простым языком. Возможно, вам будет сложно, но если хотите, можете проверить:
http://www.codechef.com/APRIL12/problems/DUMPLING/
Пожалуйста, дайте мне несколько тестовых примеров, чтобы я мог понять, где я делаю не так?
Заранее спасибо.